C语言:关于链表的输出问题,为什么需要两个重复的定义?

#include<stdio.h>#include<malloc.h>#defineLENsizeof(structstudent)structstudent*creat... #include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)

struct student *creat(); // 创建链表

struct student
{
int num;
float score;
struct student *next;
};

struct student *creat()
{
struct student *head;
struct student *p1, *p2;
p1 = p2 = (struct student *)malloc(LEN); // 第一次定义

printf("Please enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);

head = NULL;
n = 0;

while( p1->num )
{
n++;
if( 1 == n )
{
head = p1;
}
else
{
p2->next = p1;
}

p2 = p1;
p1 = (struct student *)malloc(LEN);//第二次定义,为什么这里还需要定义一次?

printf("\nPlease enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);
}

p2->next = NULL;

return head;
}
我觉得这是重复的定义,为什么需要这样?
展开
 我来答
王小白笔记
2013-09-08
知道答主
回答量:19
采纳率:0%
帮助的人:14.9万
展开全部
这个不叫重复定义,这是为p1动态分配内存空间,这样把不连续的内存空间连接起来构成链表
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
龙锋蔡生
2013-09-08
知道答主
回答量:33
采纳率:0%
帮助的人:8.3万
展开全部
动态创建一个结点,p1是一个不断变换的节点,因为每一次分配一个,它的指针域都会有新的值啦!不是第二次定义,是创建新节点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
等晨光的孩子
2013-09-08 · 超过37用户采纳过TA的回答
知道答主
回答量:127
采纳率:0%
帮助的人:69万
展开全部
不是重复定义。。。原来的那个p1 已经用掉了。。。你所谓的第二个定义 其实 已经开辟了别的地址空间。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Loylst
2013-09-08 · TA获得超过154个赞
知道小有建树答主
回答量:401
采纳率:0%
帮助的人:133万
展开全部
有必要啊,while里面的malloc是重新建立一个节点啊,第一个malloc只是建立了一个;
ps:你这里malloc(LEN)和malloc(1)的效果是一样的;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式