20双向链表

Posted 乱丶心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20双向链表相关的知识,希望对你有一定的参考价值。

  1 #define _CRT_SECURE_NO_WARNINGS
  2 
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<string.h>
  6 
  7 #define OK 1
  8 #define ERROR 0
  9 #define TRUE 1
 10 #define FALSE 0
 11 
 12 typedef int ElemType;
 13 typedef int Status;
 14 typedef struct DuLNode {
 15     ElemType data;
 16     struct DuLNode *prior;
 17     struct DuLNode *next;
 18 }DuLNode,*DuLinkList;
 19 //初始化链表
 20 void Init_DuL(DuLinkList &L) {
 21     L = (DuLinkList)malloc(sizeof(DuLNode));
 22     L->data = NULL;
 23     L->next = L;
 24     L->prior = L;
 25 }
 26 //链表长度
 27 Status Length_DuL(DuLinkList &L) {
 28     DuLinkList p;
 29     p = L->next;
 30     int i=0;
 31     while (p->data != NULL) {
 32         p = p->next;
 33         i++;
 34     }
 35     return i;
 36 }
 37 
 38 DuLinkList GetElemP_DuL(DuLinkList &L, int i) {
 39     DuLinkList p = L->next;
 40     int j = 1;
 41     while (p&&j < i) {//p不为空或者计数器j还没有等于i时,循环继续
 42         p = p->next; ++j;
 43     }
 44     if (!p || j>i || i>(Length_DuL(L) + 1)) {//第i个元素不存在或i大于表长加1时,p指向空
 45         p=NULL;
 46     }
 47     if (i == Length_DuL(L) + 1) {//i等于表长加1时,p指向头结点
 48         p = L;
 49     }
 50     return p;
 51 }
 52 
 53 Status ListInsert_DuL(DuLinkList &L, int i, ElemType e) {
 54     //在带条结点的双链循环线性表L中第i个位置之前插入元素e
 55     //i的合法值为1<=i<=表长+1
 56     DuLinkList p,s;
 57     if (!(p = GetElemP_DuL(L, i)))//在L中确定插入位置指针p
 58         return ERROR;
 59     if (!(s = (DuLinkList)malloc(sizeof(DuLNode)))) {
 60         return ERROR;
 61     }
 62     s->data = e;
 63     s->prior = p->prior;
 64     p->prior->next = s;
 65     s->next = p;
 66     p->prior = s;
 67     return OK;
 68 }
 69 //删除带头结点的双链循环线性表L的第i个元素
 70 Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e) {
 71     DuLinkList p;
 72     if (!(p = GetElemP_DuL(L, i))) {//在L中确定第i个元素的位置指针
 73         return ERROR;                //p=NULL,即第i个元素不存在
 74     }
 75     e = p->data;
 76     p->prior->next = p->next;
 77     p->next->prior = p->prior;
 78     free(p);
 79     return OK;
 80 }
 81 //释放销毁
 82 void Destory_DuL(DuLinkList &L) {
 83     DuLinkList p,q;
 84     p = L->next;
 85     while (p->data != NULL) {
 86         q = p->next;
 87         p->prior->next = p->next;
 88         p->next->prior = p->prior;
 89         free(p);
 90         p = q;
 91     }
 92     free(L);
 93 }
 94 
 95 //输出打印
 96 void printf_DuL(DuLinkList &L) {
 97     DuLinkList p;
 98     p = L->next;
 99     for (int i = 0; i < Length_DuL(L); i++) {
100         printf("%d ", p->data);
101         p = p->next;
102     }
103     printf("\\n");
104 }
105 
106 int main()
107 {
108     DuLinkList list;
109     ElemType a[] = { 11,22,33,44,55,66 };
110     ElemType e;
111     //初始化
112     Init_DuL(list);
113     //插入数据
114     for (int i = 0; i < 6; i++) {
115         ListInsert_DuL(list, i+1, a[i]);
116     }
117     //输出
118     printf_DuL(list);
119     printf("删除前长度:%d\\n", Length_DuL(list));
120     //删除
121     ListDelete_DuL(list, 1, e);
122     //输出
123     printf_DuL(list);
124     printf("删除后长度:%d\\n", Length_DuL(list));
125     printf("删除的元素:%d\\n", e);
126 
127     //销毁
128     Destory_DuL(list);
129 
130     printf("\\n");
131     system("pause");
132     return 0;
133 }

VS2015运行结果:

 

以上是关于20双向链表的主要内容,如果未能解决你的问题,请参考以下文章

双向链表JAVA代码

Java中双向链表的代码实现

带头节点的双向链表

《链表》之带头双向循环链表

如何从c中的双向链表中删除节点

7L-双线链表实现