[自学笔记] 基于C语言的数据结构
第一节 单链表
-
线性表:
- 有限的序列。
- 序列中的每个元素都有唯一的前驱和后继。
-
顺序表:分配一块连续的内存去存放这些元素,例如数组
-
链表:内存不是连续的,元素会各自被分配一块内存,内存和内存之间用指针相连。
-
单链表操作:
-
增加:
-
头插法:
在链表的最头部插入一个单元,只需要将该单元的
Next
指向下一个单元的地址即可 -
尾插法:
在链表的结尾插入一个单元,首先需要将该单元指向
NULL
,还要将原本链表的结尾指向该单元的地址,完成链表的衔接。 -
-
删除:
删除一个节点,首先要将想要删除的节点的前一个节点的
next
指向想要删除的节点的后继,之后释放(free
)掉该节点的内存占用。
-
-
代码实现
#include "stdio.h"
#include "stdlib.h"
//定义一个链表的基本单元的结构体
typedef struct Node {
int data;
struct Node* next; //定义一个指向Node类型的指针next
} Node;
//初始化一个链表,无节点,指向空
Node* initList(){
Node* list = (Node*)malloc(sizeof(Node));//定义一个指向Node大小空间地址的一个指针,新建一个空间
list -> data = 0;//该链表中元素的个数
list -> next = NULL;
return list;
}
//头插法
void headInsert(Node*list , int data){
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
node -> next = list -> next;//该节点指向原本的头节点
list -> next = node;//头结点指向新插入的节点
list -> data++;//节点数量++
}
//尾插法
void tailInsert(Node* list , int data){
Node* head = list;//定义一个指针用于遍历
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
node -> next = NULL;
head = head -> next;//获取链表的首地址
while(head -> next){//遍历,找到最后一个节点
head = head -> next;
}
head -> next = node;//最后一个节点指向插入的节点
list -> data++;//节点数量++
}
//删除
void deleat(Node* list , int data){
Node* pre = list;//要删除节点之前的节点
Node* current = list -> next;//要删除节点所指向的节点
while(current){
if(current -> data == data){//遍历找到想要删除的节点,并完成删除
pre -> next = current -> next;
free(current);//释放删除节点的空间
break;
}
pre = current;
current = current -> next;
}
list -> data--;//节点数据--
}
//输出链表
void PrintList(Node*list){
list = list -> next;
while(list){
printf("%d" , list -> data);
list = list -> next;
}
printf("\n");
}
int main()
{
Node* list = initList();
headInsert(list,1);
tailInsert(list,2);
tailInsert(list,1);
PrintList(list);
deleat(list,2);
PrintList(list);
}
自学资源来自bilibili