ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双向链表

2022-04-22 13:31:16  阅读:140  来源: 互联网

标签:Node int next 链表 双向 newNode prev 节点


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有