链表程序vc6.0可以运行但vs不能运行

应该是没有给p赋初值的原因,vc能通过但vs就不行
/#include
/#include
//链表的建立与输出
struct node//定义结点的类型
{
int num, score;
node* link;
};
void main()
{
node* creat(int n);//函数原型声明
void print(node * h);//函数原型声明
node* head = 0;//定义链头指针并初始化
head = creat(5);//调用creat函数创建链表
print(head);//调用print函数输出链表
}
node* creat(int n)
{
node* h = 0, *p, * q;
int i;
for (i = 1; i <= n; i++)
{

    p=q = (node*)malloc(sizeof(node));//分配一个结点空间
    scanf_s("%d%d", &q->num, &q->score);//输入新结点的值
    q->link = 0;//新结点的指针域置0
    if (h == 0)
        h = q;//第一个结点作为链头结点
    else
        p->link = q;//新结点添加到链表的末尾
    p = q;
}
return h;//返回链头指针

}
void print(node* h)//链表输出函数的定义
{
while (h)//当指针h非空时输出h所指结点的值
{
printf("num=%d\tscore=%d\n", h->num, h->score);
h = h->link;//使h指向下一个结点
}
}

1个回答

你的代码会导致内存泄漏啊~

原代码中creat(5)函数只会返回第一个输入的结点,其余输入的节点因为缺失引用而导致内存泄漏哈

你需要如下修改(共两处即可)

node* creat(int n)
{
node* h = 0, *p, * q;
int i;
for (i = 1; i <= n; i++)
{

/********* 第一处修改 ************/
q = (node*)malloc(sizeof(node));//分配一个结点空间

scanf_s("%d%d", &q->num, &q->score);//输入新结点的值
q->link = 0;//新结点的指针域置0
if (h == 0)

/********* 第二处修改 ************/
h=p=q;//第一个结点作为链头结点

else
p->link = q;//新结点添加到链表的末尾
p = q;
}
return h;//返回链头指针
}

Nigel_ymx
夏樾 回复hslbloc: 好的,我忘了两个语句在else下的话也要加括号的
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 按你原来的写法,即p=q,就可以了。当i=1时,p指针没有任何变化而已
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 或者在 if(h==0)语句块中加continue也行,即 if(h==0){h=p=q; continue;},这样也不会执行后面的语句
10 个月之前 回复
hslbloc
无形有道 回复夏樾: i=1时不执行p=p->link的前提,是将其放到 else 语句块中。即 else {p->link = q; p=p->link}
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc: 可是i=1是不是不会执行p=p-link吗
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 你的问题的关键,其实只是没有把第二个节点的地址存储到头节点h->link中而矣。你现在提的问题也是同样的问题哈。因此,想明白这点,你的问题就解决了
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc: 好的
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc: 呜呜呜,链表好难
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 当i>1时,使用p=p->link和p=q,就是一样的了
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 区别在于当i=1时,p->link=0,而q则等于p。如果执行p=p->link后,p就指向0了
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc: 为啥呢,p->link和q不是一样的吗
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 谢谢你,让我体会到了细节决定成败~
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 你是对的哈,p=q可以,p=p->link不行(第三处修改画蛇添足)
10 个月之前 回复
hslbloc
无形有道 回复夏樾:把你的新代码贴出来看看才知道具体问题哈
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc: 还有个问题,else 那边p=p->link是不行的,但是p=q可以,我不知道为什么,这两个应该是一样的呀
10 个月之前 回复
Nigel_ymx
夏樾 回复hslbloc:好的,谢谢啦~
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 如果还有问题,可具体提出来哈
10 个月之前 回复
hslbloc
无形有道 回复夏樾: h=h->next这样写不会指向自己哈,刚才我说h->link指向自己完全是看错了,不好意思啦。再者,这段程序发现问题并改正,即达到目的。没有问题了的话,那就这样吧~
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 这样写不会指向自己哈,刚才我说h->link指向自己完全是看错了,不好意思啦。再者,这段程序发现问题并改正,即达到目的。没有问题了,那就这样吧~
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 回复正文已更正,不好意思啦~
10 个月之前 回复
Nigel_ymx
夏樾 不对,h=h->next哪里指自己了
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 是的哈,刚才看错了。h->link是0,不是指向h自己,因此不会发生栈溢出
10 个月之前 回复
Nigel_ymx
夏樾 回复:等等,print函数确实会遇到h没动的情况,可是输出并没有问题啊
10 个月之前 回复
hslbloc
无形有道 回复夏樾: 你的设计思路没错,即h是头指针,p指向尾部,q用于保存新建节点。但是实际上p在下一个循环中,与h就没有任何关系了,不是吗?并且当循环到i≥3时,p和q之前指向的malloc节点因为缺少引用而泄漏了哈
10 个月之前 回复
hslbloc
无形有道 回复夏樾: p=p->link
10 个月之前 回复
Nigel_ymx
夏樾 我没用h->link,因为另外用了p,所以头指针没有移动
10 个月之前 回复
Nigel_ymx
夏樾 谢谢你的解答,刚刚我给p赋个初值就能运行了,p=h->link是什么意思?
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问