写的也是一些笔记的东西,都是基础的东西,如果你看其他博主关于链表教学的视频和博客感觉原理都懂了,但是一看代码就很懵的话,建议您耐心看完。
所谓动态链表为在链表的插入、删除、创建等操作时会有内存的动态变化。
1 单链表的创建
1.1 结构体定义
定义比较简单,代码如下:
//定义一个结点
struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode;
typedef struct LNode* LinkList; //LinkList = struct LNode*,方便后面调用
1.2 创建空链表
关于空链表创建其实就是创建一个头结点,代码如下:
//创建一个空表
LinkList CreatList(){
//headlist 指针在申请成功内存后变成了一个结构体变量
LinkList headlist = (LinkList)malloc(sizeof(LNode));
if(headlist == NULL){ //内存不足,申请失败
printf("内存申请失败");
return NULL;
}
//给变量初始化,其中头结点的数据域通常不赋值
// headlist->data = 1;
headlist->next = NULL;
return headlist;
}
1.3 创建结点
下面的函数是创建一个单结点的函数,其实和空链表的操作是差不多的:
//创建结点
LinkList CreatNode(int dat){
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = dat;
newnode->next = NULL;
return newnode;
}
1.4 通过头插法插入结点
以头插法来介绍以下插入的大概原理,其他方法不以赘述。
头插法的基本原理如下图:
//通过头插法插入结点
void InsertNode_ByHead(LinkList headnode,int dat){
LinkList newnode = CreatNode(dat);
//以下两行代码顺序不能变,不然会丢数据
newnode->next = headnode->next;
headnode->next = newnode;
}
2 链表打印
链表打印的基本思路流程为:
1.定义一个指针,指向头结点的下一个结点;
2.判断指针指向是否为NULL,以此判断是否到达链表尾部或此为空链表;
3.打印数据;
4.使此指针指向下一个结点;
5.重复2,3,4操作,直至结束。
//打印结点数据
void PrintList(LinkList headnode){
//指向头结点的下一个结点是因为头结点数据域无数据或不需要打印
LinkList pmove = headnode->next;
while(pmove){ //判断pmove是否指向NULL
printf("%d\n",pmove->data);
pmove = pmove->next;
}
}
3 链表删除指定数据的结点
链表删除指定数据的结点的基本思路流程为:
1.定义两个指针,a指针用来指向下一个结点,b指针用来指向a指针指向结点的上一个结点;
2.判断是否为空表;
3.判断a指针指向结点的数据域是否等于需要删除结点的数据,等于执行步骤6,不等于则执行步骤4;
4.将a指针地址赋给b指针,并将b指针的下一个结点的地址赋给a指针;
5.判断a指针指向是否为空,若不为空则执行步骤3,为空则说明已到链表末尾,说明链表内无需要删除数据的结点,则结束函数;
6.此时a指针指向的结点为我们需要删除的结点,我们需要先将b指针的指针域指向a指针的指针域;
7.删除掉a指针指向的结点;
代码如下:
//删除指定数据的结点
void DeleteList_PointData(LinkList headnode,int dat){
LinkList nodenext = headnode->next;
LinkList nodefront = headnode;
if(nodenext == NULL){
printf("空链表无法删除");
return;
}
while(nodenext->data != dat){
nodefront = nodenext;
nodenext = nodefront->next;
if(nodenext == NULL){
printf("链表中无此数据");
return;
}
}
nodefront->next = nodenext->next;
free(nodenext);
}
4 主函数中完整代码
int main(){
LinkList head = CreatList();
for(int i = 10;i > 0;i--){
InsertNode_ByHead(head,i);
}
PrintList(head);
printf("=======================================\n");
DeleteList_PointData(head,8);
PrintList(head);
return 0;
}