首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

刚学的数据结构的线性存储到小弟我这如何失灵了

2013-04-20 
刚学的数据结构的线性存储到我这怎么失灵了?帮忙看下这个程序预料之内程序崩溃了程序为什么P-elem就不能

刚学的数据结构的线性存储到我这怎么失灵了?
帮忙看下这个程序  预料之内  程序崩溃了  程序为什么P->elem就不能分配动态内存了?

# include <stdio.h>
# include <stdlib.h>
# define LIST_INIT_SIZE 3
# define LISTINCREMENT 1

typedef struct
{
int * elem;
int length;
int listsize;
}Splist;

Splist * InitList_Sp(void)
{
Splist * p;
p->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if (!p->elem)
{
printf("分配失败");
exit(-1);
}

for (int i=0; i<LIST_INIT_SIZE; i++)
{
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &p->elem[i]);
}

p->length = LIST_INIT_SIZE;
p->listsize = LIST_INIT_SIZE;
return p;
}

void ListInsert_Sp(Splist *p, int i, int val)
{
if (p->length>=p->listsize)
{
p->elem = (int *)realloc(p->elem, (p->listsize+LISTINCREMENT) * sizeof(int));
if (!p->elem)
{
printf("分配失败");
exit(-1);
}
p->length += LISTINCREMENT;
}

int * q = &(p->elem[i-1]);
for (int * s = &(p->elem[p->length-1]); s >= q; --s)
*(s+1) = *s;
*q = val;
++p->length;
return;
}

void output(Splist * p)
{
int i = 0;
while (i<p->length)
{
printf("%d\t", p->elem[i]);
i--;
}
printf("\n");
}

int main()
{
Splist * p = NULL;
p = InitList_Sp();
//printf("%p,%p,%p\n", p.elem, &p.length, &p.listsize);

int val, i;
printf("请输入要插入元素的位置:");
scanf("%d", &i);
if (i<1 || i>p->length+1)
printf("插入元素位置错误.插入失败.\n");
else
{
printf("请输入要插入元素的数据:");
scanf("%d", &val);
ListInsert_Sp(p, i, val);
printf("插入成功.\n");
}
//system("pause");
output(p);
return 0;
}
[解决办法]
Splist * p;   // p没有初始化,指向有效的空间或者对象
p->elem 
p没有指向有效的对象就使用是不可以的,这种行为
[解决办法]

引用:
引用:Splist * p;   // p没有初始化,指向有效的空间或者对象
p->elem 
p没有指向有效的对象就使用是不可以的,这种行为

我现在将p定义为变量,InitList(&amp;p)这样传参,但是输出为什么总不对

单步调试一下,看看指针是否有效,要学会调试。。。

热点排行