双向链表

Posted 夏午晴天

tags:

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

技术分享
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef int ElemType;
  4 /**
  5  * 双向链表
  6  */
  7 typedef struct Node
  8 {
  9     struct Node *pre;
 10     ElemType data;
 11     struct Node *next;
 12 } Node;
 13 
 14 void InitList(Node *&L)
 15 {
 16     L = (Node *)malloc(sizeof(Node));
 17     L -> pre = NULL;
 18     L -> next = NULL;
 19 }
 20 
 21 int GetLength(Node *L)
 22 {
 23     int length = 0;
 24     Node *p = L -> next;
 25     while(p != NULL)
 26     {
 27         length++;
 28         p = p -> next;
 29     }
 30     return length;
 31 }
 32 
 33 int GetElem(Node *L, int i, ElemType &e)
 34 {
 35     Node *p = L -> next;
 36     if(i < 1 || i > GetLength(L))
 37         return 0;
 38     for(int j = 1; j < i; j++)
 39     {
 40         p = p -> next;
 41     }
 42     e = p -> data;
 43     return 1;
 44 }
 45 
 46 int Lacate(Node *L, ElemType x)
 47 {
 48     int pos = 1;
 49     Node *p = L -> next;
 50     while(p != NULL && p -> data != x)
 51     {
 52         p = p -> next;
 53         pos++;
 54     }
 55     if(p == NULL)
 56         return 0;
 57     else return pos;
 58 }
 59 
 60 int InsertElem(Node *L, ElemType x, int i)
 61 {
 62     
 63     Node *p = L, *s;
 64     if(i < 1 || i > GetLength(L) + 1)
 65         return 0;
 66 
 67     for(int j = 1; j < i; j++)
 68     {
 69         p = p -> next;
 70     }
 71     s = (Node *)malloc(sizeof(Node));
 72     s -> data = x;
 73     s->next=NULL;
 74     s->pre =NULL;
 75 
 76     s -> next = p -> next;
 77     if(p -> next != NULL)
 78         p -> next -> pre = s;
 79     p -> next = s;
 80     s -> pre = p;
 81     return 1;
 82 }
 83 
 84 int DelElem(Node *L, int i)
 85 {
 86     if(i < 1 || i > GetLength(L))
 87         return 0;
 88     Node *p = L, *q;
 89     for(int j = 1; j < i; j++)
 90     {
 91         p = p -> next;
 92     }
 93     q = p -> next;
 94     p -> next = q -> next;
 95     q -> next -> pre = p;
 96     free(q);
 97     return 1;
 98 }
 99 
100 void PrintList(Node *L)
101 {
102     Node *p = L -> next;
103     while(p != NULL)
104     {
105         cout << p -> data << endl;
106         p = p -> next;
107     }
108 }
109 
110 void BackPrintList(Node *L)
111 {
112     Node *p = L;
113     for(int j = 1; j <= GetLength(L); j++)
114     {
115         p = p -> next;
116     }
117     while(p != NULL)
118     {
119         if(p -> pre == NULL)
120             break;
121         cout << p -> data << endl;
122         p = p -> pre;
123     }
124 }
125 
126 
127 int main()
128 {
129     Node *L;
130     InitList(L);
131     InsertElem(L,1,1);
132     InsertElem(L,2,1);
133     InsertElem(L,3,1);
134     InsertElem(L,4,1);
135     InsertElem(L,5,1);
136     InsertElem(L,6,1);
137 
138     PrintList(L);
139 
140     cout << "Reverse output elements:" << endl;
141     BackPrintList(L);
142 
143     cout << "size:" << GetLength(L) << endl;
144     
145     DelElem(L,1);
146     cout << "After deleting the first element :" << endl;
147     PrintList(L);
148 
149     cout << "2 in the table position :" << endl;
150     cout << Lacate(L,2) << endl;
151 
152     ElemType e;
153     GetElem(L,1,e);//将第一个元素的值取出
154     cout <<"The value of the first element is " << e << endl;
155     return 0;
156 }
View Code

好好的,生活还要继续,,,

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

带头节点的双向链表

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

7L-双线链表实现

代码模板实现双向链表的去重拼接合并排序

数据结构之带头结点的循环双向链表详细图片+文字讲解

双向链表 - 是啥导致我的代码引发编译器错误,我该如何解决?