链表概述
链表的作用:当一些成员数量不缺定的时候,希望可以通过上一个结点而找到下一个结点。需要使用链表。
链表在哪些地方进行应用?
节点的构成:数据域+指针域。
链表的物理拓扑结构:
链表的节点表示:结构体表示。
示例:
struct POINT{
//数据域
int vara;
char varb;
float varc;
double vard;
//指针域
struct POINT *next;
};//单向链表的节点构造的数据类型
链表根据方向:单向链表、双向链表、环形链表。
链表根据存储方式:静态链表、动态链表。
静态链表
链表长度已经固定不能发生改变。一般情况下使用结构体数组表示静态链表。
单向静态链表
方向只有一个:从链表头到链表尾部。
有头节点与尾节点的概念。
头节点的特征:头节点一般不存储数据。只使用指针域。
尾节点的特征:数据域要存储数据。指针域为NULL。
构成示例:
struct POINT{
//数据域
int vara;
char varb;
float varc;
double vard;
//指针域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
//将节点连接起来构成链表
point_buff[0].next = &point_buff[1];//头节点的指针域存储下一个节点的门牌号
point_buff[1].next = &point_buff[2]; //子节点的指针域存储下一个子节点的门牌号
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾节点的指针域存NULL
return 0;
}
遍历链表:将链表中所有的数据全部输出到屏幕。
- 向链表中存储数据----写操作
struct POINT{
//数据域
int vara;
char varb;
float varc;
double vard;
//指针域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
struct POINT *point = point_buff;
//将节点连接起来构成链表
point_buff[0].next = &point_buff[1];//头节点的指针域存储下一个节点的门牌号
point_buff[1].next = &point_buff[2];
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾节点的指针域存NULL
point = point->next;
while(point != NULL)//当前这个链表没有结束
{
printf("请输入整形、字符型、单精度、双精度数据:");
scanf("%d,%c,%f,%lf", &point->vara, &point->varb, &point->varc, &point->vard);
point = point->next;
}
return 0;
}
- 将链表中的数据输出----读操作
struct POINT{
//数据域
int vara;
char varb;
float varc;
double vard;
//指针域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
struct POINT *point = point_buff;
//将节点连接起来构成链表
point_buff[0].next = &point_buff[1];//头节点的指针域存储下一个节点的门牌号
point_buff[1].next = &point_buff[2];
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾节点的指针域存NULL
point = point->next;
while(point != NULL)//当前这个链表没有结束
{
printf("请输入整形、字符型、单精度、双精度数据:");
scanf("%d,%c,%f,%lf", &point->vara, &point->varb, &point->varc, &point->vard);
point = point->next;
}
point = point_buff;//回到链表的头
point = point->next;//越过头节点----头节点不存储数据
while(point != NULL)//当前这个链表没有结束
{
printf("%d\t%c\t%f\t%lf\r\n", point->vara, point->varb, point->varc, point->vard);
point = point->next;
}
return 0;
}
小练习:用函数实现;录入n个学生信息(不超过10个),如果有xiaoming这个同学,将xiaoming同学信息输出。学生信息包括:name、age、yuwencj、shuxuecj、waiyucj;