C++数据结构线性表的输出问题

#include <iostream>
using namespace std;
typedef int ElemType; /*指定操作对象为整型*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
/* 线性表的动态分配顺序存储结构 */
const LIST_INIT_SIZE=100; /* 线性表存储空间的初始分配量 */
const LISTINCREMENT=10; /* 线性表存储空间的分配增量 */
class SqList{
private:
ElemType *elem;
int length;
int listsize;
public:
Status InitList_Sq (){// 算法2.3 构造一个空的顺序线性表

elem=new ElemType [LIST_INIT_SIZE];
length=0;
listsize=LIST_INIT_SIZE;
return 0;

}
Status ListInsert_Sq( ElemType i, ElemType e) { // 算法2.4
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType *p;
if (i < 1 || i > length+1)
return 0; // i值不合法
if (length >= listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = new ElemType[listsize+LIST_INIT_SIZE];
if (!newbase)
return 0; // 存储分配失败
elem = newbase; // 新基址
listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(elem[i-1]); // q为插入位置
for (p = &(elem[length-1]); p>=q; --p)
*(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++length; // 表长增1
return 1;

}

};
int main(){

SqList La;
Status j,i;
/*构造LA表*/
La.InitList_Sq();
if( La.InitList_Sq()) /* 创建空表La成功 */
for(j=1;j<=5;j++) /* 在表La中插入5个元素 */
i=La.ListInsert_Sq(j,j);
cout<<"La= "<<i; /* 输出表La的内容 */
return 0;
}

以下是几个主要的错误:
1,if( La.InitList_Sq()) /* 创建空表La成功 */ 、、这里的错误是,你函数返回的0,你这判断永远是假,所以你输出的结果是一个空的,我帮你返回值改为1,但这是不安全的

2,i=La.ListInsert_Sq(j,j);
cout<<"La= "<<i; /* 输出表La的内容 */ 、、y这里两句有什么用,你ListInsert_Sq函数的返回值是1,你输出的结果永远是1。我帮你改为了e,这样会每次返回你输入的数据,但这并不代表链表中的数据,我没有查看你链表中的数据,可能里面什么都没有

3,if (length >= listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = new ElemType[listsize+LIST_INIT_SIZE];
if (!newbase)
return 0; // 存储分配失败
elem = newbase; // 新基址
listsize += LISTINCREMENT; // 增加存储容量
这里你新增了长度,确没有将?原数据复制过来,也没有将旧的内在释放,这样你在新增了长度后,因为数据没有复制过来,所以数据就并不存在了,内存也没释放,这样会造成内存泄露。

最后我只能说你再看看书,你这链表写得太差:
http://wenku.baidu.com/view/e42740dc195f312b3169a543.html 这是我自己写的,你可以参考,但里面也有几个错误,我并没有修改,但这个链表是可以正常运行的。

下面是我帮你调试了一下,可以运行,但输出的结果不一定正确,因为你输出的只是函数的返回值,并不是整个表的数据,而且你的返回值也不对
#include <iostream>
using namespace std;
typedef int ElemType; /*指定操作对象为整型*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
/* 线性表的动态分配顺序存储结构 */
const LIST_INIT_SIZE=100; /* 线性表存储空间的初始分配量 */
const LISTINCREMENT=10; /* 线性表存储空间的分配增量 */
class SqList{
private:
ElemType *elem;
int length;
int listsize;
public:
Status InitList_Sq (){// 算法2.3 构造一个空的顺序线性表

elem=new ElemType [LIST_INIT_SIZE];
length=0;
listsize=LIST_INIT_SIZE;
return 1;
}
Status ListInsert_Sq( ElemType i, ElemType e) { // 算法2.4
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType *p;
if (i < 1 || i > length+1)
return 0; // i值不合法
if (length >= listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = new ElemType[listsize+LIST_INIT_SIZE];
if (!newbase)
return 0; // 存储分配失败
elem = newbase; // 新基址
listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(elem[i-1]); // q为插入位置
for (p = &(elem[length-1]); p>=q; --p)
*(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++length; // 表长增1
return e;
}
};
int main(){

SqList La;

Status j,i;

/*构造LA表*/

La.InitList_Sq();

if(La.InitList_Sq()) /* 创建空表La成功 */
{
for(j=1;j<=5;j++) /* 在表La中插入5个元素 */
{
i=La.ListInsert_Sq(j,j);
cout<<"La= "<<i; /* 输出表La的内容 */
}
cout<<endl;
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-22
#include <iostream>
#include <ctime>
using namespace  std;
typedef int ElemType; /*指定操作对象为整型*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
/* 线性表的动态分配顺序存储结构 */
const LIST_INIT_SIZE = 100; /* 线性表存储空间的初始分配量 */
const LISTINCREMENT = 10; /* 线性表存储空间的分配增量 */
class SqList {
private:
ElemType *elem;
int length;
int listsize;
public:
SqList() { // 算法2.3 构造一个空的顺序线性表
elem = new ElemType [LIST_INIT_SIZE];
length = 0;
listsize = LIST_INIT_SIZE;
}
Status ListInsert_Sq(ElemType e,int pos) {  // 算法2.4
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L) + 1
if(length >= listsize) {   // 当前存储空间已满,增加容量
ElemType *newbase = new ElemType[listsize + LISTINCREMENT];
if(newbase == NULL) return 0;   // 存储分配失败
for(int i = 0; i < length; ++i) // 复制原表数据
newbase[i] = elem[i];
delete []elem;
elem = newbase;             // 新基址
listsize += LISTINCREMENT;  // 增加存储容量
}
if(pos < 1 ) pos = 1; // 小于1则插入到表首
if(pos > length) elem[length] = e;  // 大于length则插入到表尾
else {
for(int i = length; i > pos - 1; --i)
elem[i] = elem[i - 1];
elem[pos - 1] = e;
}
++length;   // 表长增1
return 1;
}
void ShowList() {
for(int i = 0; i < length; ++i) {
if(i && i % 10 == 0) cout << endl;
cout.width(4);
cout << elem[i];
}
cout << endl;
}
~SqList() { delete [] elem; }
};

int main(){
SqList La; // 调用构造函数构建新表
int x,pos;
srand(time(NULL));
for(int i = 0;i < 122; i++) { /* 在表La中插入5个元素 */
x = rand()%500; // 插入数据随机产生
pos = rand()%300;
La.ListInsert_Sq(x,pos);
}
La.ShowList(); /* 输出表La的内容 */
return 0;
}