链表
一、链表(linkedlist)
-
定义:动态分配内存的数据结构,按需随时开辟,随时释放
-
由结点组成
-
结点:
-
数据成员:存储数据
-
指针成员:储存下一结点的首地址
-
定义形式:
-
表头结点的地址最为重要,常定义一个头指针来存放表头结点的地址,用来找到该链表
- 对链表的操作:
- 建立链表
- 输出链表
- 删除结点
- 插入结点
二、建立链表
- 逐个开辟,并且建立联系
- 两种方法:
- 表尾添加法(常用):
- 将新结点插入表尾
- 结点的次序和输入顺序一致
- 表头添加法
- 将新结点插入表头
- 节点的次序和输入顺序相反
- 步骤:
- 建立头指针及头结点(头结点不放数据)
- 循环输入数据,并连接结点
-
最后一个结点地址域空置
-
实例:学生管理系统
#include <stdio.h>
#include <stdlib.h>
typedef struct stu_node{
int num;
float score;
struct stu_node *next;
}stu;
#define LEN sizeof(struct stu_node)
stu * creat(){ //无参数
stu *p1 = NULL,*p2 = NULL,*head = NULL;
int n;
float s;
printf("请输入学号和成绩(输入0时结束)\n");
scanf("%d %f",&n, &s); //读取学号与成绩
while(n!=0){ //判断是否继续
p1 = (stu *)malloc(LEN); //开辟一块内存
p1->num = n; //读入学号和成绩
p1->score = s;
if(head == NULL) head = p1; //头指针为空,则指向表头结点
else p2->next = p1; //头指针不为空,则p2的指针成员指向p1
p2 = p1; //p2指向新的表尾结点
scanf("%d %f",&n,&s); //再次读取数据
}
p2->next = NULL; //结尾
return head; //返回头指针
}
三、输出链表
- 遍历
- 使用
- 通过头指针找到链表
- 输出,并利用一个指针指向下一个结点
- 重复2,直到指针指向NULL
- 实例:学生管理系统
void list(stu *head){
stu *p;
if(head==NULL)printf("链表为空\n" );
else{
p = head;
while (p != NULL){
printf("%d,%5.2f\n",p->num,p->score);
p=p->next; //令p指向下一个结点
}
}
}
void main(){
stu *head; //定义一个结点类型的指针变量
head = creat(); //创建链表
list(head); //输出
}