首页 > 代码库 > C语言双向循环链表实现及图示(初始化/插入链表/清空/销毁)
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 }
C语言双向循环链表实现及图示(初始化/插入链表/清空/销毁)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。