c++顺序表程序,编译没有错误,但是运行时就是不行,求指教 5
#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、修改结构体成员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];
如果你还不明白,可以追问,我给你修改后的完整代码。