DS-7-双链表的初始化,插入,删除与遍历
初始化:
typedef struct DNode { int data; struct DNode *prior,*next; }DNode, *DLinkList; //初始化双链表 bool InitDLinkList(DLinklist &L) { L = (DNode *)malloc(sizeof(DNode)); //分配一个头结点 if (L == NULL) //内存不足,分配失败 return fatse; L->prior = NULL; //头结点之后暂时还没有节点 L->next = NULL; //头结点的 prior 永远指向 NULL return true; } //判断双链表是否为空(带头结点) bool Empty(DLink list L) { if (L->next == NULL) return true; else return false; }
后插操作:
//在p结点之后插入s结点 bool InsertNextDNode(DNode *p, DNode *s) { if (p == NULL Il s == NULL) //非法参数 return false; s->next = p->next; if (p->next != NULL) //如果p结点有后继结点 p->next->prior = s; s->prior = p; p->next = s; return true; }
有了后插操作,类似的按位序插入与前插操作也是很容易实现
删除与销毁:
//删除p结点的后继结点 bool DelLeteNextbNode(DNode *p) if (p == NULL) return false; DNode *q = p->next; //找到p的后继结点q if (q == NULL) return false; //p没有后继 p->next = q->next; if(q->next!=NULL) //q结点不是最后一个结点 q->next->prior=p; free(q); //释放结点空间 return true; } //销毁双链表L void DestoryList(DLinklist &L){ //循环释放各个数据结点 while (L->next != NULL) DeleteNextDNode(L); free(L); //释放头结点 L=NULL; //头指针指向NULL }
遍历:
//后向遍历 while (p != NULL) { // 对 结点 p 做相应处理,如打印 p = p->next; } //前向遍历 while (p != NULL) { // 对结点 p 做相应处理 p = p->prior; } //前向遍历(跳过头结点) while (p->prior != NULL) { // 对结点 p 做相应处理 p= p->prior; }
双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· MySQL 优化利器 SHOW PROFILE 的实现原理
· 在.NET Core中使用异步多线程高效率的处理大量数据
· 聊一聊 C#前台线程 如何阻塞程序退出
· 几种数据库优化技巧
· 聊一聊坑人的 C# MySql.Data SDK
· 干掉EasyExcel!FastExcel初体验
· 跟着 8.6k Star 的开源数据库,搞 RAG!
· .NET 阻止系统睡眠/息屏
· 快手后端面试,被面试官秒挂了!
· .NET 9 中的 多级缓存 HybridCache