#include<stdio.h>
#include<malloc.h>
//定义链表中每个节点的结构
typedef struct _Node {
int data;
struct _Node* p_Next;
}Node;
//定义链表的表头,表头用来存放链表第一个节点的地址
//链表的表头就代表了这个链表
typedef struct _List {
Node* List_Head;
}List;
//创建一个链表,用List类型,因为表头就代表着整个链表
List* CreatList() {
//为新的链表表头分配空间
List* new_List = (List*)malloc(sizeof(List));
new_List->List_Head = NULL; //新的链表中,表头节点初始化为空
return new_List;
}
//创建一个节点
Node* CreatNode(int n_data) {
//为新的节点分配空间
Node* new_Node = (Node*)malloc(sizeof(Node));
new_Node->data = n_data;
new_Node->p_Next = NULL;
return new_Node;
}
//头插法,从链表的表头开始插入
void List_Head_Insert(List* ListHead,int n_data) {
//如果链表头为空,也代表着链表中没有节点存在
if (ListHead->List_Head == NULL) {
Node* First_Node = CreatNode(n_data);//创建一个节点作为链表的第一个节点
ListHead->List_Head = First_Node;
return;
}
//如果链表的表头已经存在
Node* Insert_Node = CreatNode(n_data);
Insert_Node->p_Next = ListHead->List_Head;
ListHead->List_Head = Insert_Node;
}
//头部节点的删除
void Head_Node_Delete(List* ListHead) {
//如果说表头的下一跳为空,即后方不存在节点了
//那么可以直接删除
if (ListHead->List_Head->p_Next == NULL) {
free(ListHead->List_Head);
}
//否则就不能直接删除,要让下一跳成为新的表头
Node* temp;
temp = ListHead->List_Head->p_Next;
free(ListHead->List_Head);
ListHead->List_Head = temp;
}
//打印链表
void Print_List(Node* p_Move) {
while (p_Move) {
printf("%d\n",p_Move->data );
p_Move = p_Move->p_Next;
}
printf("\n");
}
int main() {
List* list1 = CreatList();
List_Head_Insert(list1, 111);
List_Head_Insert(list1, 222);
List_Head_Insert(list1, 333);
List_Head_Insert(list1, 444);
List_Head_Insert(list1, 555);
List_Head_Insert(list1, 666);
Print_List(list1->List_Head);
Head_Node_Delete(list1);
Print_List(list1->List_Head);
return 0;
}```
C语言之单向链表的头插法和删除
最新推荐文章于 2023-02-11 20:49:26 发布