节点
节点主要由以下两块组成:
- 数据
- 指向下一个节点的指针
链表
链表主要由以下几块组成:
- 一系列节点
每个节点至少包括:
一条数据(任意类型)
一个该节点类型的指针
节点之间首尾相连(指向链表中下一个节点的指针) - 头指针:指向第一个节点的指针
- 尾节点:节点指针指向空
上图表示一个4个节点组成的链表,链表是由一系列的节点, 头指针(head)与尾节点(即最后一个next指向空);每个节点由data(数据)和next(指向下一个节点的指针)组成.
创建链表
创建链表主要涉及下面的几步:
1. 创建节点
2. 链:使每个节点的指针域存储后继节点的地址
3. 头:确定头文件(head)
4. 尾:确定尾节点
/*创建链表,输入学生的个数以及对应的学号与分数.*/
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
long num;
float score;
struct student *next;
}STU;
STU *creat(int n)
{
/*head node*/
STU *Pt, *prePt, *head; //head为头指针,Pt为指针变量
Pt = (STU *)malloc(sizeof(STU)); //申请一块空间,把这个地址返回到指针变量Pt中.
if (Pt!=NULL) //申请成功
{
scanf("%ld,%f", &Pt->num, &Pt->score);
/*确定头节点*/
head = Pt; //确定Pt为头指针
prePt = Pt; //prePt用来保存链表当前的尾节点的地址,在此,头结点既是头结点又是尾节点.
}
else
{
printf("Failed.\n");
exit(0);
}
/*other node*/
int i;
for (i=1; i<n; i++)
{
Pt = (STU *)malloc(sizeof(STU));
if (Pt!=NULL)
{
scanf("%ld,%f", &Pt->num, &Pt->score);
prePt->next = Pt;//prePt->next存储新的节点的地址,即Pt.(当前链表的尾节点为prePt)
prePt = Pt;//prePt存储的都是当前链表的尾节点地址
}
else
{
printf("Failed.\n");
exit(0);
}
}
/*链表尾节点指针域为空*/
Pt->next = NULL; //判断尾节点
return head;
}
void main()
{
printf("Please the number of students:");
int num;
scanf("%d", &num);
creat(num);
}