自己用C写的list双向链表头文件
1 #ifndef _LIST_H_ 2 #define _LIST_H_ 3 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <stdbool.h> 7 8 typedef int DataType; 9 struct node{ 10 DataType data; 11 struct node * next; 12 struct node * prev; 13 }; 14 15 typedef struct node Node; 16 17 struct list{ 18 Node * root; 19 Node * tail; 20 size_t size; 21 }; 22 23 typedef struct list List; 24 25 void init(List * l); 26 void destroy(List * l); 27 size_t size(List * l); 28 bool isEmpty(List * l); 29 void addNodeAfter(Node * pn, Node * new_node); 30 void addFirst(List * l, DataType item); 31 void addLast(List * l, DataType item); 32 DataType getFirst(List * l); 33 DataType getLast(List * l); 34 void removeNodeAfter(Node * pn); 35 DataType removeFirst(List * l); 36 DataType removeLast(List * l); 37 void showAll(List * l); 38 39 //用calloc创建2个带有默认初始值的Node,分别赋给root,和tail,并链接好root和tail. 40 void init(List * l) 41 { 42 Node * pnode = (Node *)calloc(2, sizeof(Node)); 43 l->root = pnode; 44 l->tail = ++pnode; 45 l->root->next = l->tail; 46 l->tail->prev = l->root; 47 l->size = 0; 48 } 49 50 //释放占用内存 51 void destroy(List * l) 52 { 53 Node * dnode = NULL; 54 while(l->root != NULL) 55 { 56 dnode = l->root; 57 l->root = l->root->next; 58 free(dnode); 59 } 60 l->root = l->tail = NULL; 61 l->size = 0; 62 } 63 64 //返回当前元素个数 65 size_t size(List * l) 66 { 67 return l->size; 68 } 69 70 bool isEmpty(List * l) 71 { 72 return l->size == 0; 73 } 74 75 //将新增节点new_node链接在节点pn后面 76 void addNodeAfter(Node * pn, Node * new_node) 77 { 78 new_node->next = pn->next; 79 pn->next->prev = new_node; 80 new_node->prev = pn; 81 pn->next = new_node; 82 } 83 84 //向链表头部添加新元素item 85 void addFirst(List * l, DataType item) 86 { 87 Node *pnode = (Node *)malloc(sizeof(Node)); 88 pnode->data = item; 89 addNodeAfter(l->root, pnode); 90 ++(l->size); 91 } 92 93 //向链表尾部添加新元素item 94 void addLast(List * l, DataType item) 95 { 96 Node *pnode = (Node *)malloc(sizeof(Node)); 97 pnode->data = item; 98 addNodeAfter(l->tail->prev, pnode); 99 ++(l->size); 100 } 101 102 //返回链首元素的值 103 DataType getFirst(List * l) 104 { 105 if(isEmpty(l)) 106 return -2147483648; 107 return l->root->next->data; 108 } 109 110 //返回链尾元素的值 111 DataType getLast(List * l) 112 { 113 if(isEmpty(l)) 114 return -2147483648; 115 return l->tail->prev->data; 116 } 117 118 //删除pn后面的节点,并释放被删节点占用的内存 119 void removeNodeAfter(Node * pn) 120 { 121 pn->next = pn->next->next; 122 free(pn->next->prev); 123 pn->next->prev = pn; 124 125 } 126 127 //移除链首元素 128 DataType removeFirst(List * l) 129 { 130 if(isEmpty(l)) 131 return -2147483648; 132 DataType ret = l->root->next->data; 133 removeNodeAfter(l->root); 134 --(l->size); 135 return ret; 136 } 137 138 //移除链尾元素 139 DataType removeLast(List * l) 140 { 141 if(isEmpty(l)) 142 return -2147483648; 143 DataType ret = l->tail->prev->data; 144 removeNodeAfter(l->tail->prev->prev); 145 --(l->size); 146 return ret; 147 } 148 149 //遍历链表 150 void showAll(List * l) 151 { 152 if(isEmpty(l)) 153 { 154 printf("empty data! "); 155 return; 156 } 157 Node * current = l->root->next; 158 while(current != l->tail) 159 { 160 printf("%d ", current->data); 161 current = current->next; 162 } 163 printf(" "); 164 } 165 166 #endif