其他分享
首页 > 其他分享> > 双向链表

双向链表

作者:互联网

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 // 节点结构
  5 
  6 struct LinkedList
  7 {
  8     // 节点
  9     struct Node
 10     {
 11         int item = 0;
 12         Node *prev;
 13         Node *next;
 14 
 15         // 得到一个新节点
 16         static Node *get(Node *prev, int item, Node *next)
 17         {
 18             Node *newNode = (Node *)malloc(sizeof(Node));
 19             newNode->item = item;
 20             newNode->prev = prev;
 21             newNode->next = next;
 22             return newNode;
 23         }
 24     };
 25 
 26     // 首节点
 27     Node *first;
 28     // 尾节点
 29     Node *last;
 30     // 节点个数
 31     int size;
 32     // LL分配内存空间
 33     static LinkedList *initial()
 34     {
 35         LinkedList *l = (LinkedList *)malloc(sizeof(LinkedList));
 36         l->first = NULL;
 37         l->last = NULL;
 38         l->size = 0;
 39         return l;
 40     }
 41 
 42     // 返回指定元素索引处的(非空)节点
 43     Node *node(int index)
 44     {
 45         if (index < (size >> 1))
 46         {
 47             Node *x = first;
 48             for (int i = 0; i < index; i++)
 49                 x = x->next;
 50             return x;
 51         }
 52         else
 53         {
 54             Node *x = last;
 55             for (int i = size - 1; i > index; i--)
 56                 x = x->prev;
 57             return x;
 58         }
 59     }
 60 
 61     // 添加到链表第一个
 62     void linkFirst(int e)
 63     {
 64         Node *f = first;
 65         Node *newNode = Node::get(NULL, e, f);
 66         first = newNode;
 67         if (f == NULL)
 68             last = newNode;
 69         else
 70             f->prev = newNode;
 71         size++;
 72     }
 73 
 74     // 添加到链表最后一个
 75     void linkLast(int e)
 76     {
 77         Node *l = last;
 78         Node *newNode = Node::get(l, e, NULL);
 79         last = newNode;
 80         if (l == NULL)
 81             first = newNode;
 82         else
 83             l->next = newNode;
 84         size++;
 85     }
 86 
 87     // 取消非空节点x的链接
 88     int unlink(Node *x)
 89     {
 90         int element = x->item;
 91 
 92         // 指定节点的前节点
 93         Node *prev = x->prev;
 94         // 指定节点的后节点
 95         Node *next = x->next;
 96 
 97         // 指定节点的前节点为 空
 98         if (prev == NULL)
 99             // 指定节点的后节点 指向 首节点
100             first = next;
101         else
102         { //指定节点的前节点为 非空
103             // 指定节点的后节点 指向 指定节点的前节点的后节点
104             prev->next = next;
105             x->prev = NULL;
106         }
107 
108         if (next == NULL)
109             last = prev;
110         else
111         {
112             next->prev = prev;
113             x->next = NULL;
114         }
115 
116         free(x);
117         size--;
118         return element;
119     }
120 
121     // 添加到链表第一个
122     void addFirst(int e)
123     {
124         linkFirst(e);
125     }
126 
127     // 添加到链表最后一个
128     void addLast(int e)
129     {
130         linkLast(e);
131     }
132 
133     // 添加节点
134     bool add(int e)
135     {
136         linkLast(e);
137         return true;
138     }
139 
140     // 参数是否为现有元素的索引
141     bool isElementIndex(int index)
142     {
143         return index >= 0 && index < size;
144     }
145     void checkElementIndex(int index)
146     {
147         if (!isElementIndex(index))
148             throw;
149     }
150 
151     // 删除列表中指定位置的元素
152     int remove(int index)
153     {
154         checkElementIndex(index);
155         return unlink(node(index));
156     }
157 
158     void print()
159     {
160         Node *node = first;
161         while (node != NULL)
162         {
163             printf("item = %d\n", node->item);
164             node = node->next;
165         }
166 
167         printf("列表中元素的个数 = %d\n", size);
168     }
169 };
170 
171 int main()
172 {
173     LinkedList *l = LinkedList::initial();
174     l->add(233);
175     l->add(234);
176     l->add(235);
177     l->add(236);
178     l->print();
179     
180     l->remove(2);
181 }

 

标签:Node,int,next,链表,双向,newNode,prev,节点
来源: https://www.cnblogs.com/lshuai-/p/16178481.html