第一章 线性结构-双向链表
哔哩哔哩数据结构讲解地址:https://space.bilibili.com/356198029
本代码视频讲解地址:https://www.bilibili.com/video/av62218948
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; //数据 struct node *front;//指向上一个结点 struct node *next;//指向下一个结点 } Node; Node* init() { Node *first = (Node*)malloc(sizeof(Node)); first->data = -1; //第一个结点的前地址 指向最后一个元素 看到后面你就明白了为什么这么做 first->front = first; //第一个元素的头指向最后一个元素 也可以为空 都行 first->next = NULL; return first; } void Add(Node* List,int data) { Node* temp_List = List; while(temp_List->next) temp_List = temp_List->next; Node* new_Node = (Node*)malloc(sizeof(Node)); //申请内存 new_Node->data = data; new_Node->front = temp_List;//指向上一个结点 new_Node->next = NULL;//下一个结点为空 temp_List->next = new_Node;//上一个结点的next 为新结点的地址 List->front = new_Node;//将头结点的最后一个元素地址更新 } void Show(Node* List) { Node* temp_List = List; printf("List = ["); while(temp_List->next) { temp_List = temp_List->next; printf("%d, ",temp_List->data); } printf("]\n"); } void ReverseShow(Node* List) { Node* temp_List = List->front;//让temp指针指向最后一个元素 printf("ReverseList = ["); while(temp_List->front != List->front) { printf("%d, ",temp_List->data); temp_List = temp_List->front; } printf("]\n"); } void Delete(Node* List,int del_data) { Node* temp_List = List; while(temp_List->data != del_data&&temp_List->next) temp_List = temp_List->next; if(temp_List->data == del_data){ //改变temp 前后的指针 temp_List->front->next = temp_List->next; temp_List->next->front = temp_List->front; free(temp_List); } else printf("未查找到\n"); } void Insert(Node* List,int index,int data) { Node* temp_List = List; while(index--&&temp_List->next) temp_List = temp_List->next; Node* new_Node = (Node*)malloc(sizeof(Node));//新结点 //一堆指针指来指去(重要考点!!!!!) new_Node->data = data; new_Node->next = temp_List->next; new_Node->front = temp_List; temp_List->next = new_Node; new_Node->next->front = new_Node; } void Select(Node* List,int index);//自己完成查找 void Alter(Node* List,int data,int index);//自己完成修改 int main() { Node* List_First; List_First = init(); printf("%d\n",List_First->data);//检测初始化是否成功 Add(List_First,5); Add(List_First,4); Add(List_First,6); Add(List_First,8); Add(List_First,9); Add(List_First,1); Add(List_First,2); Show(List_First); ReverseShow(List_First); Delete(List_First,6); printf("--------删除后-----------\n"); Show(List_First); ReverseShow(List_First); Insert(List_First,2,100); Insert(List_First,4,888); printf("--------插入后-----------\n"); Show(List_First); ReverseShow(List_First); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!