静态链表
链表概念我理解的就是几个结构体变量串在一起的链式结构
静态链表创建 图片借用b站
#include "stdio.h"
#include "stdlib.h"
struct Node
{
int number;
struct Node *next;
};
void main()
{
struct Node Node1 = {1,NULL};
struct Node Node2 = {1,NULL};
struct Node Node3 = {1,NULL};
Node1.next = &Node2;
Node1.next = &Node3;
system("pause");
}
动态链表
动态链表 : 动态内存申请 + 模块化设计
链表要实现的功能
- 创建链表 (创建表头)
- 创建节点
- 插入节点
- 删除节点
创建链表
表头也是一个结构体
创建表头的函数:
struct Node* createlist()
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
/* 创建一个指向结构体的指针(表头)并为他申请内存,使他成为结构体变量 */
headNode->number = NULL;
return headNode;
}
创建节点
节点是暂未与链表连接的一个节点
创建节点函数:
struct Node* createNode(int data) //创建节点
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
/* 同样申请内存将指针变成结构体变量 */
newNode->number = data;
newNode->next = NULL;
return newNode;
}
插入节点(头插法)
将节点插在表头之后的插入方法
头插法函数:
void insertNode_HEAD(struct Node* headNode,int data)
{
struct Node* newNode = createNode(data);
newNode -> next = headNode->next;
headNode -> next = newNode;
}
节点删除(指定位置删除)
原理是从表头和表头的下一个节点开始,依次往下寻找与指定数据相同的节点,找到该节点后,让这个节点的上一个节点指向这个节点的下一个节点并free这个节点的内存。
节点删除函数:
void Delete(struct Node* headNode,int data)
{
struct Node* posFront = headNode;
struct Node* posNode = headNode->next;
if(posNode ==NULL)
printf("链表为空");
else
{
while(posNode->number!=data)
{
posFront = posNode;
posNode = posFront->next;
if(posNode == NULL)
{
printf("未找到指定位置");
break;
}
posFront->next = posNode->next;
free(posNode);
}
}
}