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

#include<iostream>#include<string>#include<cstdlib>#include<fstream>usingnamespacestd... #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;
}
展开
 我来答
pengguismile
2013-05-08 · TA获得超过687个赞
知道小有建树答主
回答量:332
采纳率:100%
帮助的人:121万
展开全部

你的错误在于结构体中使用了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;
}

 

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

sczgcat
2013-05-07 · 超过13用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:19.8万
展开全部
楼主 ”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];

如果你还不明白,可以追问,我给你修改后的完整代码。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式