双向链表
作者:互联网
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