双向循环链表
来源:互联网 发布:网络安全技术的重要性 编辑:程序博客网 时间:2024/05/21 11:00
使用哨兵(头节点)
实现双向循环链表,所谓哨兵(头结点):哑对象,简化边界条件处理。假设在链表L中设置一个对象L.nil ,该对象 代表NIL,但也具有和其他对象相同的各个属性。对于链表代码中出现的每一处对NIL的引用,都替换成L.nil 。
这样的调整将一个常规的双向链表变成一个有哨兵的双向循环链表。哨兵位于表头和表尾之间。
L.nil.next 指向表头, L.nil.prev 指向表尾。
#include <stdio.h>#include <stdlib.h> #define ElemType inttypedef struct DLINKLIST{ ElemType data; struct DLINKLIST *prev; struct DLINKLIST *next;}DoubleLinkList;/* * according to the lib c * return 0 means successful * return -1 means failed * * our double-link-list has a NIL node ! */int init_dlinklist(DoubleLinkList *list){ if ((list = (DoubleLinkList *)malloc(sizeof(DoubleLinkList))) == NULL) { perror("error: init malloc"); return -1; } list->data = 0; list->prev = list; list->next = list; return 0;}DoubleLinkList * search_dlinklist(DoubleLinkList *list, ElemType target){ DoubleLinkList *tmp = list->next; while (tmp != list && tmp->data != target) tmp = tmp->next; return tmp;}int del_dlinklist(DoubleLinkList *list, DoubleLinkList *target){ if (target == list) return -1; target->next->prev = target->prev->next; target->prev->next = target->next; return 0;}int insert_dlinklist(DoubleLinkList *list, ElemType target){ DoubleLinkList *tmp; if ((tmp = (DoubleLinkList *)malloc(sizeof(DoubleLinkList))) == NULL) { perror("error: insert malloc error"); return -1; } tmp->data = target; tmp->next = list->next; list->next->prev = tmp; list->next = tmp; tmp->prev = list; return 0;}
0 0
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 循环双向链表
- 工科生16年码农的困惑,梦想如何实现,我选择错了吗?事业单位,国企,外企,私企,创业哪个应该属于我?
- 在android 自定义listView中绘制矩形
- (C语言)如何判断是不是文字
- android app如何检查和管理activity 的结果
- 欧拉四面体公式
- 双向循环链表
- android获得所有的安装app列表,并运行指定app
- c/c++ 2进制打印输出
- 零基础HTML5游戏制作教程 第3章 图形的移动
- Eclipse android 开发工具报错 R.java not generating
- 第17周项目--胖子伤不起
- CentOS 7.0安装遨游浏览器
- application:didFinishLaunchingWithOptions
- BZOJ 2693 jzptab 莫比乌斯反演