自己用C写的list双向链表

自己用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!\n");
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("\n");
164 }
165 
166 #endif
List

 

posted @ 2017-10-10 20:19  黑马网仔  阅读(275)  评论(0编辑  收藏  举报