读书人

C顺序表有关问题

发布时间: 2013-09-17 13:35:59 作者: rapoo

C顺序表问题
下面程序输出的第11个数的结果不对 为什么啊 求大神解答


# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# define MaxSize 10
typedef int ElemType;
typedef struct{
int *elem;
int length;//表长
int listsize;//空间容量
}Sqlist;

void initSqlist(Sqlist *L)
{
L->elem = (int *)malloc(MaxSize*sizeof(ElemType));
if(!L->elem)
exit(0);
L->length = 0;
L->listsize = MaxSize;
}

// 插入函数
//item 插入数
// i插入位置
void insertElem(Sqlist *L,int i,ElemType item)
{
ElemType *base ,*insertPtr,*p;
if(i<1 || i> L->length +1)
exit(0);
if(L->length > L->listsize)
{
base = (ElemType*)realloc(L->elem,(L->listsize +10)*sizeof(ElemType));
L->elem = base;
L->listsize = L->listsize+100;
}
insertPtr = &(L->elem[i-1]);
for(p = &(L->elem[L->length -1]);p>=insertPtr;p--)
*(p+1)= *p;
*insertPtr = item;
L->length++;
}

//删除函数
void DelElem(Sqlist *L,int i)
{
ElemType *delItem,*q;
if(i<1||i>L->length)
exit(0);
delItem = L->elem + i-1;//注意
q = L->elem+L->length-1;
for(++delItem;delItem<=q;++delItem)
*(delItem-1)= *delItem;
L->length--;

}


void main()
{
Sqlist l;
int i ;
//初始化
initSqlist(&l);

//插入数据
for(i=0 ;i<15;i++)
insertElem(&l,i+1,i+1);

// 输出
printf("number\n");
for(i=0 ;i<l.length;i++)
printf("%d",l.elem[i]);
printf("%d ",l.elem[10]);
printf("\n\n\n");


//删除11位
DelElem(&l,11);
for(i=0 ;i<l.length;i++)
printf("%d",l.elem[i]);
}
c 数据结构
------解决方案--------------------


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

[解决办法]
#define MaxSize 10
改为
#define MaxSize 100
试试?
[解决办法]
关于realloc


1. realloc失败的时候,返回NULL

2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错)

3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
4. 如果size为0,效果等同于free()
5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的


所以少用

把size改大试试先
[解决办法]
if(L->length > L->listsize)
>改成>=

base = (ElemType*)realloc(L->elem,(L->listsize +10)*sizeof(ElemType));
L->elem = base;
L->listsize = L->listsize+100;
10和100都改成MaxSize

读书人网 >C语言

热点推荐