创建一个单链表并输出单链表
①基本思路:
- 定义一个结构体,包含数据域和指针域,前者为该结点保存的用户数据,后者为该结点保存的下一个相邻结点的地址。
- 定义一个结点创建函数(返回head),用head指向第一个结点、p1开辟新节点、p2连接新节点。
- 定义一个结点输出函数,用do…while形式依次打印出每一个结构体成员数据域。
- 在main()函数中,依次调用上述函数。
②源代码:
/* 创建一个单链表,每个结点包含三个元素,学生编号、分数、保存下一个节点地址的指针 */
#include <stdio.h>
#include <stdlib.h>
#define len sizeof(struct Student)//每个结点所占用存储空间大小
struct Student
{
long num;
float score;
struct Student * next;//保存下一个相邻结点的地址
};
int n;//用于记录结点个数
/*获取单链表头指针*/
struct Student *creat()
{
/*head指向头结点,并作为最后函数返回值。*/
/*p1负责开辟新结点(永远指向新结点)*/
/*p2负责链接下一个相邻结点,即p2的next成员指向后面的p1(指向最后一个结点)*/
struct Student *head,*p1,*p2;
n=0;
p1=p2=(struct Student *)malloc(len);//开辟第一个结点,p1和p2都指向该结点
printf("Enter the num and the score please:\n");
scanf("%ld,%f",&p1->num,&p1->score);//输入第一个学生的编号和成绩
head=NULL;
while(p1->num!=0)//新开辟的结点中,p1->num成员数据不是0,则一直循环
{
n=n+1;
if(n==1)head=p1;//只有一个结点,确定头指针
else p2->next=p1;//有多个结点,使第一个结点的next指向第二个结点的地址
p2=p1;//p2指向最后一个结点,为开辟下一个结点做准备
p1=(struct Student *)malloc(len);//开辟下一个结点
scanf("%ld,%f",&p1->num,&p1->score);//输入其它学生的编号和成绩
}
p2->next=NULL;
return(head);
}
/*输出单链表*/
void print(struct Student *head)
{
struct Student *p;
printf("\nThese %d nodes are:\n",n);
p=head;
do
{
printf("%ld,%f\n",p->num,p->score);//输出头结点数据
p=p->next;//依次输出其它结点数据
}while(p!=NULL);//p=NULL表明已到表尾,退出循环
}
void main()
{
struct Student * head;
head=creat();//返回头指针
print(head);//从头指针所指向结点开始,依次打印出其它结点数据
}
③运行结果: