关于链表的创建(以创建学生信息链表为例):
【1】struct student* create()中函数名前的*表示:函数返回的是一个struct student类型的指针
【2】要判断开辟节点有没有成功
如果失败,则返回NULL,表示链表创建失败;
如果成功,则head=p1,表示链表已创建(注意!此时头指针还没有学生信息!)。
p1=(struct student*)malloc(sizeof(struct student)); //开辟一个新节点
if(p1==NULL) //节点开辟失败
{
printf("\n【出错】新建学生信息列表失败!请稍后再试!\n");
return NULL;
}
else //节点开辟成功
{
head=NULL; //确保信息无效的情况下链表也为空
...
... //录入学生信息
p2=p1; //保存p1以备后用
}
【3】要对节点数进行判断
节点数=1,head=p1(此时头节点才有学生信息),p1、p2、head此时都表示最后一个节点,next指向NULL;
节点数>1,原来最后的节点p2指向新创建的节点p1,p2再保存p1,以备p1继续开辟。
while(number!=0) //只要学生学号不为0
{
n+=1; //节点数加1
if(n==1) //如果节点数为1,则head就是p1
{
head=p1;
p2->next=NULL; //此时p2=p1,即p1->NULL
}
else
{
p2->next=p1; //p2指向刚开辟的新节点
}
p2=p1; //默认p1为最后一个结点,且方便p1继续开辟新节点
p1=(struct lianxiren*)mallo(SIZE); //p1继续开辟新节点
...
... //录入信息
}
【4】创建链表完成的时候,最后一个节点p2要指向NULL,且释放**p1分配到的空间,并将之赋**NULL。
p2->next=NULL; //链表最后一个节点指向NULL
free(p1); //释放p1开辟的空间
p1=NULL; //把p1赋值,不然就是野指针
【5】函数返回值是链表的头指针(因为链表只可从头开始遍历)