记录一下复习c语言建立单链表的过程,加了一些注释便于理解。
首先了解一下关于单链表的各种概念:
1.头结点:在开始结点之前的结点(可有可无),其值域不包含任何信息,也可以包含链表长度等信息。
2.头指针:永远指向链表中第一个结点的位置,如果链表有头结点,头指针指向头结点;否则,头指针指向开始结点,即第一个节点。
3.带有头节点单链表头指针head指向头结点。头指针head始终不等于NULL,head->next等于NULL的时候链表为空。
4.不带头结点的单链表头指针head指向开始结点,当head等于NULL时链表为空。
5.头结点和头指针的区别:头指针是一个指针,头指针指向链表的第一个结点(如果链表有头结点,头指针指向头结点;否则,头指针指向开始结点);头结点是一个实际存在的点,它包含有数据域和指针域。头指针什么时候都应该存在,而头节点可有可无。
下面是具体代码和个人的理解注释:
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
//单链表的结构定义
int data; //定义int类型的数据域
struct node *next; //定义指针域
}node,*Linklist;
//1.
//typedef:为类型添加别名,增加代码扩展性,这里将 struct node 起别名为:node 和Linklist
//2.最后的 node, *Linklist,上面代码可以分解为:
//typedef struct LNode LNode; //将结构体类型struct LNode重命名为node ,强调节点
//typedef struct LNode LinkList; //将struct node * 重命名为LinkList,类似于int p;定义一个int类型的指针。强调指针
//两者等价
//初始化单链表 并设置为空表
node *initlist(node *l) {
l = (node *)malloc(sizeof(node));
l->next = NULL;//使头结点的指针域为空,建立一个空的单链表
return l;
}
//利用头插法建立单链表 (对头结点后插操作),逆向创建单链表
void creatfromhead(node *l) {
node *p; //新建一个结点指针 ,永远指向当前链表的头结点
int i;
scanf_s("%d", &i); //输入i,用于指代输入的整数,将要放进链表的数据元素,也用来控制while循环,当我输入i的值为-1时结束。
while (i != -1) {
p = (node *)malloc(sizeof(node));//新建一个结点
p->data = i; //把输入的值赋值给新结点的指针域
p->next = l->next; //把新结点插入到表头
l->next = p; //头结点要始终放在最前面
scanf_s("%d", &i)