C语言双向循环链表实现及图示(初始化/插入链表/清空/销毁)

————————————————————————————————————————————

双向循环链表 //遍历等执行方法与普通双向链表相同,不单独列举

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

初始化+尾插法

图示:

实现代码

 1 /* 初始化双向循环链表,head的头尾均指向本身 */
 2 void InitList(pNode **head)
 3 {
 4     pNode *p;
 5     *head = (pNode *)malloc(sizeof(pNode));
 6     if ((*head) == NULL)
 7         exit(0);
 8     (*head)->next = (*head);
 9     (*head)->prev = (*head);
10 }
11 /* 插入,在链表第n个位置插入元素 */
12 pNode *InsertList(pNode **head)
13 {
14     pNode *p, *s;
15     int i = 0;
16     p = (*head)->prev; //p始终指向尾节点
17     int n;
18     printf("The input to the position of the insert:");
19     scanf("%d", &n);
20     s = (pNode *)malloc(sizeof(pNode));
21     if (s == NULL)
22         exit(0);
23     printf("Input to insert element value:");
24     scanf("%d", &s->data);
25     if (s->data <= 0)
26         return p;
27     while(i < n - 1)
28     {
29         i++;
30         p = p->next;
31     }
32     s->prev = p;
33     s->next = p->next;
34     p->next->prev = s;
35     p->next = s;
36     InsertList(head);
37 }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

销毁或清空链表:

实现代码:

 1 /* 清空链表,保留头指针 */
 2 void ClearList(pNode **head)
 3 {
 4     pNode *p;
 5     p = (*head)->next;
 6     while(p != (*head))
 7     {
 8         p = p->next;
 9         free(p->prev);
10     }
11     (*head)->next = (*head)->prev = (*head);//头节点的两个指针域指向自身
12 }
13 /* 彻底销毁链表,头指针置空 */
14 void DestroyList(pNode **head)
15 {
16     pNode *p;
17     p = (*head)->next;
18     while(p != (*head))
19     {
20         p = p->next;
21         free(p->prev);
22     }
23     free(*head);
24     (*head) = NULL;
25 }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

完整代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 typedef struct Node pNode;
 5 typedef struct Node
 6 {
 7     int data;
 8     struct Node *prev, *next;
 9 } Node;
10 /* 初始化双向循环链表,head的头尾均指向本身 */
11 void InitList(pNode **head)
12 {
13     pNode *p;
14     *head = (pNode *)malloc(sizeof(pNode));
15     if ((*head) == NULL)
16         exit(0);
17     (*head)->next = (*head);
18     (*head)->prev = (*head);
19 }
20 /* 插入,在链表第n个位置插入元素 */
21 pNode *InsertList(pNode **head)
22 {
23     pNode *p, *s;
24     int i = 0;
25     p = (*head)->prev; //p始终指向尾节点
26     int n;
27     printf("The input to the position of the insert:");
28     scanf("%d", &n);
29     s = (pNode *)malloc(sizeof(pNode));
30     if (s == NULL)
31         exit(0);
32     printf("Input to insert element value:");
33     scanf("%d", &s->data);
34     if (s->data <= 0)
35         return p;
36     while(i < n - 1)
37     {
38         i++;
39         p = p->next;
40     }
41     s->prev = p;
42     s->next = p->next;
43     p->next->prev = s;
44     p->next = s;
45     InsertList(head);
46 }
47 /* 遍历打印 */
48 void PrintList(pNode *head)
49 {
50     pNode *p;
51     p = head->next;//从头结点之后开始循环打印
52     while(p != head)
53     {
54         printf("%d ", p->data);
55         p = p->next;
56     }
57     printf("\n");
58 }
59 /* 清空链表,保留头指针 */
60 void ClearList(pNode **head)
61 {
62     pNode *p;
63     p = (*head)->next;
64     while(p != (*head))
65     {
66         p = p->next;
67         free(p->prev);
68     }
69     (*head)->next = (*head)->prev = (*head);//头节点的两个指针域指向自身
70 }
71 /* 彻底销毁链表,头指针置空 */
72 void DestroyList(pNode **head)
73 {
74     pNode *p;
75     p = (*head)->next;
76     while(p != (*head))
77     {
78         p = p->next;
79         free(p->prev);
80     }
81     free(*head);
82     (*head) = NULL;
83 }
84 int main(int argc, char const *argv[])
85 {
86     pNode *head, *last;
87     InitList(&head);
88     last = InsertList(&head);
89     PrintList(head);
90     ClearList(&head);
91     printf("%p %p %p\n", head, head->next, head->prev); //验证是否头节点指向自身
92     DestroyList(&head);
93     printf("%p\n",head);//验证是否已经完全销毁
94     return 0;
95 }
时间: 2024-08-25 19:57:14

C语言双向循环链表实现及图示(初始化/插入链表/清空/销毁)的相关文章

C语言双向循环链表api(源自gluster源码)

C语言双向循环链表api(源自gluster源码)基本的操作如增加.删除和遍历等 #include <stdio.h> #include <stdlib.h> #include <string.h> /*定义表头*/ struct list_head { struct list_head *next; struct list_head *prev; }; /*表头初始化*/ #define INIT_LIST_HEAD(head) do { (head)->nex

c语言双向循环链表

双向循环链表,先来说说双向链表,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.而循环链表之前也有说过,单链表中就是让最后一个结点的指针指向第一个结点就能构成一个循环链表,这里其实也是一样的,只不过多了一步,让第一个结点的前驱指向最后一个结点就行了,(这里介绍的是带头结点的双向循环链表,所以用第一个结点和头结点来区分两者).下面直接看看怎么创建一个带头结点的双向循环链表吧

(java实现)双向循环链表

什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的结构.因为双向循环链表的节点不仅包含指向下一个节点的指针(next),还包含指向前一个节点的指针(prev). 在双向循环链表中,可见的不只有头指针head,还有尾节点end.这是和单链表的区别. 双向循环链表的头指针head的前一个节点指向end,尾节点end的后一个节点指向head. 基本操作

数据结构基础(12) --双向循环链表的设计与实现

双向链表的操作特点: (1) "查询" 和单链表相同; (2)"插入" 和"删除"时需要同时修改两个方向上的指针. 但是对于双向循环链表则在表尾插入非常的迅速, 只需O(1)的时间,因为有指向前面的指针, 因此双向循环链表会很容易的找到位于表尾的元素,因此双向循环链表比较适用于频繁在表尾插入的情况. 空链表: 双向循环链表节点构造: class DoubleListNode { private: Type data; DoubleListNode

数据结构之双向链表(包含双向循环链表)

双向(循环)链表是线性表的链式存储结构的又一种形式. 在之前已经讲述了单向链表和循环链表.相比于单向链表只能从头结点出发遍历整个链表的局限性,循环链表使得可以从任意一个结点遍历整个链表. 但是,不管单向链表也好,循环链表也罢,都只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点).鉴于上述问题,引入了双向链表.由于双向循环链表包含双向链表的所有功能操作.因此,我们只讲述双向循环链表. 与单向链表不同,双向链表的结点构造如下图所示.即一个结点由三个

双向循环链表(C语言描述)(四)

下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入.删除.查找.查找和获取链表元素操作. 在程序初始化时,除了初始化链表,还要将保存在文件中的词库加载到链表中: 1 void dict_init() { 2 list = linkedlist_new(); 3 4 dict_load(); 5 printf("Welcome."); 6 }

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

双向循环链表-C语言版

源文件部分: #include<stdio.h> #include<string.h> #include<malloc.h> typedef int Elemtype; #include"Delist.h" int main() { Dlnode head=NULL; instruction(head); return 0; } 头文件部分: typedef struct DLnode { Elemtype data; struct DLnode *