单链表


不带头结点

.h部分

 1 #ifndef LIST_H
 2 #define LIST_H
 3 
 4 #include 
 5 typedef int Elemtype; //元素类型
 6 typedef int Rank; //
 7 typedef struct ListNode
 8 {
 9     Elemtype data;
10     struct ListNode *next;
11 }ListNode, *List;
12 
13 void Init(List *L); //初始化
14 bool Empty(List L); //判空
15 int Length(List L); //长度
16 ListNode *GetElem(List L, Rank i); //按位查找
17 ListNode *LocateElem(List L, Elemtype e); //按值查找
18 ListNode *Insert(List *L, int i, Elemtype e); //按位插入
19 ListNode *InsertAsSucc(ListNode *p, Elemtype e); //插入后继
20 ListNode *InsertAsPred(ListNode *p, Elemtype e); //插入前驱
21 ListNode *InsertAsFirst(List *L, Elemtype e); //首节点插入
22 ListNode *InsertAsLast(List *L, Elemtype e); //末节点插入
23 //Elemtype Delete(ListNode *p); //删除节点(除末节点外)
24 Elemtype Delete(List *L, Rank i); //删除节点
25 void Traverse(List L, void (*Visit)(Elemtype e)); //遍历
26 void Clear(List *L); //重置
27 void Destroy(List *L); //销毁
28 void Reverse(List *L); //逆置
29 
30 #endif

.c部分

  1 #include 
  2 #include 
  3 
  4 static ListNode *NewNode()
  5 {
  6     ListNode *new_node = (ListNode *)malloc(sizeof(ListNode));
  7     assert(new_node);
  8     return new_node;
  9 }
 10 
 11 void Init(List *L)
 12 {
 13     *L = NULL;
 14 }
 15 
 16 bool Empty(List L)
 17 {
 18     return !L;
 19 }
 20 
 21 int Length(List L)
 22 {
 23     int len = 0; ListNode *p = L;
 24     while (p)
 25     {
 26         p = p->next;
 27         len++;
 28     }
 29     return len;
 30 }
 31 
 32 ListNode *GetElem(List L, Rank i)
 33 {
 34     int j = 0; ListNode *p = L;
 35     while (j < i && p)
 36     {
 37         p = p->next;
 38         j++;
 39     }
 40     if (j == i)
 41         return p;
 42     else
 43         return NULL;
 44 }
 45 
 46 ListNode *LocateElem(List L, Elemtype e)
 47 {
 48     ListNode *p = L;
 49     while (p && p->data != e)
 50         p = p->next;
 51     return p;
 52 }
 53 
 54 ListNode *Insert(List *L, int i, Elemtype e)
 55 {
 56     if (i < 0)
 57         exit(EXIT_FAILURE);
 58     else if (i == 0)
 59     {
 60         ListNode *new_node = NewNode();
 61         new_node->data = e;
 62         new_node->next = *L;
 63         *L = new_node;
 64         return new_node;
 65     }
 66     else
 67     {
 68         ListNode *p = GetElem(*L, i - 1);
 69         assert(p);
 70         ListNode *new_node = NewNode();
 71         new_node->data = e;
 72         new_node->next = p->next;
 73         p->next = new_node;
 74         return new_node;
 75     }
 76 }
 77 
 78 ListNode *InsertAsSucc(ListNode *p, Elemtype e)
 79 {
 80     assert(p);
 81     ListNode *new_node = NewNode();
 82     new_node->data = e;
 83     new_node->next = p->next;
 84     p->next = new_node;
 85     return new_node;
 86 }
 87 
 88 ListNode *InsertAsPred(ListNode *p, Elemtype e)
 89 {
 90     ListNode *newNode = InsertAsSucc(p, e);
 91     newNode->data = p->data;
 92     p->data = e;
 93     return newNode;
 94 }
 95 
 96 ListNode *InsertAsFirst(List *L, Elemtype e)
 97 {
 98     ///* 方法一 */
 99     //InsertAsPred(*L, e);
100 
101     /* 方法二 */
102     ListNode *new_node = NewNode();
103     new_node->data = e;
104     new_node->next = *L;
105     *L = new_node;
106     return new_node;
107 }
108 
109 ListNode *InsertAsLast(List *L, Elemtype e)
110 {
111     ListNode *new_node = NewNode();
112     new_node->data = e;
113     if (!*L)
114         *L = new_node;
115     else
116     {
117         ListNode *p = *L;
118         while (p->next)
119             p = p->next;
120         p->next = new_node;
121     }
122     new_node->next = NULL;
123     return new_node;
124 }
125 
126 //Elemtype Delete(ListNode *p)
127 //{
128 //    assert(p);
129 //    ListNode *q = p->next; Elemtype e = p->data;
130 //    p->data = q->data;
131 //    p->next = q->next;
132 //    free(q);
133 //    return e;
134 //}
135 
136 Elemtype Delete(List *L, Rank i)
137 {
138     if (i < 0)
139         exit(EXIT_FAILURE);
140     else if (i == 0)
141     {
142         if (!*L)
143             exit(EXIT_FAILURE);
144         ListNode *p = *L; Elemtype e = (*L)->data;
145         *L = (*L)->next;
146         free(p);
147         return e;
148     }
149     else
150     {
151         ListNode *p = GetElem(*L, i-1);
152         assert(p); assert(p->next);
153         ListNode *q = p->next; Elemtype e = (*L)->next->data;
154         p->next = q->next;
155         free(q);
156         return e;
157     }
158 }
159 
160 void Traverse(List L, void (*Visit)(Elemtype e))
161 {
162     ListNode *p = L;
163     while (p)
164     {
165         Visit(p->data);
166         p = p->next;
167     }
168 }
169 
170 void Clear(List *L)
171 {
172     ListNode *p = *L;
173     while (p)
174     {
175         *L = (*L)->next;
176         free(p);
177         p = *L;
178     }
179 }
180 
181 void Destroy(List *L)
182 {
183     Clear(L);
184     free(*L);
185 }
186 
187 void Reverse(List *L)
188 {
189     ListNode *p = *L, *q;
190     *L = NULL;
191     while (p)
192     {
193         q = p->next;
194         p->next = *L;
195         *L = p;
196         p = q;
197     }
198 }

带头结点

.h部分

.c部分