三、双链表
来源:互联网 发布:单片机wifi通信编程 编辑:程序博客网 时间:2024/06/05 22:37
- 序言
- 双链表表示
- 初始化
- 获取指定节点
- 添加
- 删除
- 销毁
- 序言
序言
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。 所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
双链表表示
typedef struct DNode { struct DNode *next; struct DNode *pre; ELEMENT data;} DNode, *PDNode;
初始化
void init_dlist(PDNode *pHead) { *pHead = malloc(sizeof(DNode)); if (*pHead == NULL) {/* 存儲分配失敗 */ exit(OVERFLOW); } (*pHead)->next = NULL; (*pHead)->pre = NULL;};
获取指定节点
int get_length_dlist(PDNode pHead) { PDNode tempHead = pHead; int count = 0; while (tempHead != NULL) { tempHead = tempHead->next; count++; } return count;};
添加
找到pos-1在pos位置插入.图解
//add to list endbool insert_element_dlist(PDNode pHead, int pos, ELEMENT data) { PDNode tempHead = pHead; if (pos < 1 || pos > get_length_dlist(tempHead)) { return false; } if (pos == 1) { //链表没有0位置.要找的是pos-1位置插入.所以pos==1特殊处理 PDNode newNode = malloc(sizeof(DNode)); newNode->next = tempHead->next; newNode->data = data; tempHead->next = newNode; newNode->pre = tempHead; return true; } tempHead = get_element_dlist(tempHead, pos - 1); PDNode newNode = malloc(sizeof(DNode)); newNode->data = data; newNode->pre = tempHead; newNode->next = tempHead->next; tempHead->next = newNode; return true;};
删除
找到pos-1的位置.删除pos
bool del_element_dlist(PDNode pHead, int pos, ELEMENT *data) { PDNode tempHead = pHead; if (pos < 1 || pos > get_length_dlist(tempHead) + 1) { return false; } if (pos == 1) { PDNode freeNode = tempHead->next; if (freeNode == NULL) { return false; } freeNode->pre->next = freeNode->next; if (freeNode->next == NULL) { return false; } freeNode->next->pre = freeNode->pre; return true; } tempHead = get_element_dlist(tempHead, pos - 1); if (tempHead == NULL) { return false; } PDNode freeNode = tempHead->next; *data = freeNode->data; freeNode->pre->next = freeNode->next; if (freeNode->next != NULL) { freeNode->next->pre = tempHead; } free(freeNode); return true;}
销毁
void destroy_dlist(PDNode *pHead) { PDNode q, p = (*pHead)->next; /* p指向第一个结点 */ while (p != *pHead) /* p没到表头 */ { q = p->next; free(p); p = q; } free(*pHead);};
打印
void print_dlist(PDNode pHead) { PDNode tempNode = pHead->next; while (tempNode != NULL) { printf("%d", tempNode->data); tempNode = tempNode->next; }};
github:
https://github.com/HumorSmith/DataStructure/tree/master/link_list
引用:
http://blog.csdn.net/qq490691606/article/details/49948263
阅读全文
0 0
- 三、双链表
- (三)
- (三)
- 三
- 三
- 三
- 三
- 三
- 三
- 三
- 三
- “三”
- 三
- 三
- C 语言设计模式(三) 双链表
- 神经网络三之三
- 三周任务三
- 三三法则
- 《C和指针》:存储类型
- C#163课的主要内容
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理
- 最近最久未使用(LRU)置换算法
- Cocos2d-JS 热更新
- 三、双链表
- QT creator+OpenCV2.4.2+MinGW 在windows下开发环境配置
- 第二次数据库课后习题(第四五章)
- shiro-从数据库中获取授权信息与显示菜单在页面上(注解版和jsp标签)
- 「一句话经典」从Spring到SpringMVC再到JavaEE开发颠覆者Spring Boot,最后佛法无边Spring Cloud;只不过却成了nodejs的笑柄
- 八大排序之--快速排序
- 基于对论文Content Importance Models for Scoring Writing From Sources的简单的1-gram的实现
- CF Round #413( Div.1/2) Fountains(线状数组查找)
- 操作系统(Operating System)2