💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
本文转自 https://blog.csdn.net/mbuger/article/details/52528242 ### 介绍 链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 ### 和顺序表的区别 顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上也相邻,所以插入删除需要移动元素。链表使用指针链表示线形表元素的逻辑关系,插入和删除只需修改指针,不能随机存取。 ![](https://box.kancloud.cn/c922da1997d6863bc47b235c46540417_760x268.png) ### 代码实现 typedef struct node{ int data; struct node *next; }node_t; typedef node_t *list; ### 链表操作 void InitList(list* head)//初始化 { assert(head); *head = NULL; } list ByeNode(int data)//申请一个结点 { list newNode = NULL; newNode = (list)malloc(sizeof(Node)); if (NULL == newNode) { printf("out of memory.\n"); exit(1); } else { newNode->data = data; newNode->next = NULL; } return newNode; } void PopBack(list* head)//尾删 { assert(head); if (NULL == *head) { return; } else if(NULL == (*head)->next) { list Temlist = *head; free(Temlist); Temlist = NULL; *head = NULL; } else { list PCur = *head; while (PCur->next->next) { PCur = PCur->next; } PCur->next = NULL; } } void PushBack(list* head, int data)//尾插 { assert(head); if (NULL == *head) { *head = ByeNode(data); } else { list PCur = NULL; PCur = *head; while (PCur->next) { PCur = PCur->next; } PCur->next = ByeNode(data); } } void PushFront(list *head, int data)//头插 { assert(head); list PreNode = NULL; list Node = ByeNode(data); PreNode = *head; Node->next = PreNode; *head = Node; } void PopFront(list *head)//头删 { assert(head); list PreNode = *head; if (NULL == *head) { return; } else if (NULL == (*head)->next) { *head = NULL; } else { *head = PreNode->next; free(PreNode); PreNode = NULL; } } list Find(list* head, int data)//查找 { assert(head); list PCur = *head; while (PCur) { if (data == PCur->data) break; PCur = PCur->next; } return PCur; } void Destroy(list* head)//销毁 { assert(head); list PCur = *head; while (PCur->next) { list Dnode = PCur; PCur = PCur->next; free(Dnode); Dnode = NULL; } } int Empty(list head)//判空 { if (NULL == head) return 0; else return 1; } int Size(list head)//求链表中结点的个数 { list Node = head; int num = 0; while (Node) { num++; Node = Node->next; } return num; } void PrintList(list* head)//打印单链表 { list PCur = *head; assert(head); while (PCur) { printf("%d->",PCur->data); PCur = PCur->next; } printf("NULL\n"); } void Insert(list pos, int data)//在data后插入结点 { list newNode = ByeNode(data); list PreNode = pos; newNode->next = PreNode->next; PreNode->next = newNode; }