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

2024-12-03 19:03:32
推荐回答(2个)
回答1:

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

DelRam(L);
 return 0;
}

 

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

回答2:

楼主 ”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];

如果你还不明白,可以追问,我给你修改后的完整代码。