c++顺序表程序,编译没有错误,但是运行时就是不行,求指教

#include<iostream>
#include<string>
#include<cstdlib>
#include<fstream>
using namespace std;

#define MAXSIZE 100

typedef struct
{
string num;
string name;
string phone;
}Type;

typedef struct
{
Type *data;
int size;
}SeqList;

int IniList(SeqList &L)
{
L.data=(Type*)malloc(MAXSIZE*sizeof(Type));
if(L.data==NULL)
{
cout<<"overflow"<<endl;
return 0;
}
L.size=0;
return 1;
}

void InsertRear(SeqList &L,Type item)
{
if (L.size ==MAXSIZE)
cout<<"Insert:SeqList is full!"<<endl;
L.data[L.size]=item;
L.size++;
}

int main()
{
SeqList L;
Type temp;
int i;
if( !IniList(L) ) cout<<"error"<<endl;
else
{
while( cin>>temp.num>>temp.name>>temp.phone )
{
if(temp.num == "0" && temp.name == "0" && temp.phone == "0") break;
else
{
InsertRear(L,temp);
}
}
for(i=0; i<L.size; i++)
{
cout<<L.data[i].num<<endl;
}
}
return 0;
}

你的错误在于结构体中使用了string类型,结构体在你定义的时候大小就固定了(如果struct大小不固定,编译器就不可能让我们使用sizeof来计算大小),而string是不定长得,所以运行的时候程序试图访问越界内存时就会出现“某某某内存不能为read!”,你要么使用定长字符数组,要么定义一个指针,先动态分配内存,再将指针指向该内存,当然,分配内存后记得释放掉,你得程序就有这个问题,光知道使用malloc,不记得free。

另外,你的这种思路不是不行,但建立链表可能是更好得选择。

你的程序还有一个问题:L.data[L.size]=item;结构体的内容拷贝可不能这么干,你必须将每一项拷贝进去。

以下是代码和运行结果:

#include "iostream.h"
#include "string.h"
#include "stdlib.h"
#define MAXSIZE 100

typedef struct
{
// string num;
// string name;
// string phone;
 char num[100];
}Type;

typedef struct
{   
 Type *data;
 int size;
}
SeqList;

int IniList(SeqList &L)
{  
 L.data=(Type*)malloc(MAXSIZE*sizeof(Type));  
 if(L.data==NULL)    
 { 
 cout<<"overflow"<<endl;
 return 0; 
 } 
 L.size=0;  
 return 1;
}

void DelRam(SeqList &L)//不要忘记释放内存
{
 free(L.data);
}

void InsertRear(SeqList &L,Type item)//*
{   
 if (L.size ==MAXSIZE)cout<<"Insert:SeqList is full!"<<endl;
 strcpy(L.data[L.size].num,item.num);
 L.size++; //////
}

int main()
{
 SeqList L;
 Type temp;
 int i;
 L.size=1;////

 if( !IniList(L) ) cout<<"error"<<endl;
 else
 {
 // while( cin>>temp.num>>temp.name>>temp.phone )
  while( cin>>temp.num )//调试方便
  {
  // if(temp.num == "0" && temp.name == "0" && temp.phone == "0") break;  
  if(strcmp(temp.num,"0")==0)break;//调试方便
   else
   {
    InsertRear(L,temp);
   }
 }

  for(i=0; i<L.size; i++)
  {
   cout<<L.data[i].num<<endl; 
  }
 }

DelRam(L);
 return 0;
}

 

另外,作为程序员应该严谨一点,不要想当然,没有调试过的话建议不要乱给答案。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-07
楼主 ”Type *data; “ 是一个结构体指针,你想把它当做结构体指针数组来用。” L.data[L.size]=item; ”
我根据你程序要实现的意思,提出几种修改建议:
1、修改结构体成员Type *data;为数组 Type data[MAXSIZE];
原:
typedef struct
{
Type *data;
int size;
}SeqList;
修改为:
typedef struct
{
Type data[MAXSIZE];
int size;
}SeqList;

2、修改结构体对象
原:
SeqList L;
修改为:
SeqList L[MAXSIZE];

如果你还不明白,可以追问,我给你修改后的完整代码。本回答被网友采纳

这个程序在DEV C++上可以运行并出现正确结果 但是提交到PTA就会报错...
回答:当 C 语言程序能够正常编译并运行,但可能结果可疑或不对时,即,当程序没有语法错误而可能有逻辑错误时,就需要考虑使用调试 Debug功能来找出程序的 bug。 在调试过程中,可以让程序运行到设置好的断点处并暂停下来,然后通过观察相关的变量值是否正确,来判断程序的逻辑错误可能出现在哪里。 本文以 Dev-...

C++编译运行时提示无法解析的外部符号
看错误信息,编译应该没什么问题,是在链接的时候出的错,C++中,使用模板编程的时候,声明和实现都要写在头文件中,如果实现不在头文件中,就会出现链接的时候,找不到符号的情况。你把实现都放到头文件中去,应该就没什么问题了。

数据结构顺序表编译程序无法运行,提醒我在定义listinit第二排(malloc...
\/\/ 用C++编译器进行测试\/\/ 而C编译器没有bool,false,true这些变量或者常量#include <stdlib.h>#include <stdio.h>#include <malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define List_INIT_SPACE 100 \/\/原代码 list_INIT_SPACE#define List_INC_SPACE 10 \/\/原代码 list_...

告诉我怎么改(c++) 错误: request for member `a' in `b', which is...
1、首先在编译过程中,偶尔会遇到“c++: internal compiler error: Killed (program cc1plus)”错误,这是内存不足造成的。2、首先输入命令创建交换分区:dd if=\/dev\/zero of=\/swapfile bs=1k count=2048000,count后面的数值意思是交换分区的大小为2G。3、建立好之后,需要让系统知道它是交换分区,...

求助:关于C++数据结构,结构体数组插入失败顺序表的问题
不知道你用的什么编译器,除了字符串直接可以用来初始化对象直接赋值以外,字符串给变量赋值是不可能通过的,因此你的字符串赋值操作本身就是错误的做法,你可以参考strcopy和memcopy两个函数看看字符串的赋值操作。

编写程序求出顺序表中最大元素及其在表中的位置(用C++)
using namespace std;void main(){ int i,j;int max;int a[10];cout<<"请输入要排序的元素"<<endl;for(i=0;i<10;i++){ cin>>a[i];} for(i=1;i<10;i++){ max=a[0];if(a[i]>max){ max=a[i];j=i+1;} } cout<<"最大的数是"<<max<<endl;cout<<"在表中的...

我用c++实现一个线性顺序表,用的是void类型,没有返回值,用if后,return...
函数前面加void就是没有返回值的意思,如果加了void,函数中就不必出现return语句。如果函数中有“return;”语句,执行到这里,会跳出函数。注意是“return;”,不是“return()”。加分号就行了,不要加括号。

第32篇:Cython的容器操作-顺序表
对于有C基础的同学,这相当于C中的数组指针。编译Cython程序时,建议使用setup.py方式,以便将numpy的Python代码编译成C代码,并在setup.py文件中显式设置include_dirs参数,该参数包含numpy相关的C\/C++头部文件。在setup.py设定档中未指定numpy.get_includes()时,Cython编译器可能会遇到"fatal error: ...

c++ 数组初始化有误? 调试的时候数组下的写法是:expression cannot b...
错误有两处:一是构造函数中局部变量data覆盖了成员变量data;二是构造函数中last的初值应为-1而不为0。因为按照你的设计,last应为顺序表的末元素下标。初始化顺序表为空,故last不应该为0。改正如下(还另外添了一个print函数辅助输出顺序表):\/\/.h include <iostream> include <cstdlib> using ...

编译c++出错:parse error before 'typedef'
你的代码没有给全吧,编译都过不去啊。根本编译不到"parse error before 'typedef'"这一步,编译时直接#include"LinearList.h"找不到 是不是有头文件没给出

相似回答