C 双向链表实现(主要是重新练一下指针)

写了双向链表,因为增删改查都离不开链表的遍历,所以把遍历写成了一个可以添加函数指针的函数。虽然顺便回顾了一下函数指针,但实际代码量没有减少。

@author chihp

 下面是源代码:

DNode.h
 1 #pragma once
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 
 7 typedef struct DNode{
 8     struct DNode *pre;
 9     struct DNode *next;
10     int value;
11 } DNode;
12 
13 
14 DNode *NewNode(int value);
15 void ModNode(DNode *head, int src, int dst);
16 void _ModNode(DNode **curNode, DNode *tmpNode, int *value);
17 void _DelNode(DNode **curNode, DNode *tmpNode);
18 void DelNode(DNode **head, int value);
19 void _AddNodeToEnd(DNode **curNode, DNode *tmpNode);
20 void AddNode(DNode *Head, int value);
21 void ErgNodeEx(DNode **Head, DNode *tmpNode, void *OPNode);
22 void ErgNodeEx2(DNode *Head, DNode *tmpNode, void *OPNode, int param1);
23 DNode *FindNode(DNode *Head, int value);
24 void _PrintNode(DNode *curNode);
25 void PrintNode(DNode *Head);
26 void FreeNode(DNode **node);
27 void DelAllNode(DNode **head);
28 void _DelAllNode(DNode **curNode, DNode *tmpNode);

 

DNode.c:
  1 // DNode.c : 双向链表
  2 //
  3 
  4 #include "DNode.h"
  5 
  6 // 查找节点
  7 DNode *FindNode(DNode *Head, int value)
  8 {
  9     DNode *curNode;
 10     if (Head == NULL)
 11     {
 12         return NULL;
 13     }
 14     curNode = Head->next;
 15     while (curNode != NULL)
 16     {
 17         if (curNode->value == value)
 18         {
 19             return curNode;
 20         }
 21         curNode = curNode->next;
 22     }
 23     return NULL;
 24 }
 25 // ergodic遍历
 26 void ErgNode(DNode *Head, void *OPNode)
 27 {
 28     DNode *curNode;
 29     int (*func)(DNode *);
 30     func = OPNode;
 31     if (Head == NULL)
 32     {
 33         return;
 34     }
 35     curNode = Head;
 36     while (curNode != NULL)
 37     {
 38         (*func)(curNode);
 39         curNode = curNode->next;
 40     }
 41 }
 42 void PrintNode(DNode *Head)
 43 {
 44     if (Head == NULL)
 45     {
 46         return;
 47     }
 48     ErgNode(Head, _PrintNode);
 49     printf("\n");
 50 }
 51 
 52 void _PrintNode(DNode *curNode)
 53 {
 54     if (curNode == NULL)
 55     {
 56         return;
 57     }
 58     printf("%d ", curNode->value);
 59 }
 60 
 61 void ErgNodeEx(DNode **Head, DNode *tmpNode, void *OPNode)
 62 {
 63 
 64     if ((*Head) == NULL)
 65     {
 66         return;
 67     }
 68     DNode *curNode;
 69 
 70     int (*func)(void **, void *);
 71     func = OPNode;
 72 
 73     curNode = (*Head);
 74     while (1)
 75     {
 76         (*func)(&curNode, tmpNode);
 77         if (curNode != NULL && curNode->pre == NULL)
 78         {
 79             (*Head) = curNode;
 80         }
 81         if ((*Head)->next == NULL && curNode == NULL)
 82         {
 83             (*Head) = curNode;
 84         }
 85         if (curNode == NULL)
 86         {
 87             break;
 88         }
 89         if (curNode != NULL)
 90         {
 91             curNode = curNode->next;
 92         }
 93 
 94     }
 95 }
 96 
 97 void ErgNodeEx2(DNode *Head, DNode *tmpNode, void *OPNode, int param1)
 98 {
 99     if (tmpNode == NULL)
100     {
101         return;
102     }
103     if (Head == NULL)
104     {
105         return;
106     }
107     DNode *curNode;
108 
109     int (*func)(void **, void *, void *);
110     func = OPNode;
111 
112     curNode = Head->next;
113     while (curNode != NULL)
114     {
115         curNode = curNode->next;
116         (*func)(&curNode, tmpNode, &param1);
117     }
118 }
119 // 在结尾增加
120 void AddNode(DNode *Head, int value)
121 {
122     DNode *nextNode = NewNode(value);
123     ErgNodeEx(&Head, nextNode, _AddNodeToEnd);
124 }
125 
126 void _AddNodeToEnd(DNode **curNode, DNode *tmpNode)
127 {
128     if ((*curNode) == NULL)
129     {
130         return;
131     }
132     if ((*curNode)->next == NULL)
133     {
134         (*curNode)->next = tmpNode;
135         tmpNode->pre = (*curNode);
136         (*curNode) = (*curNode)->next;
137     }
138 }
139 void DelNode(DNode **head, int value)
140 {
141     DNode *tmpNode = NewNode(value);
142     ErgNodeEx(head, tmpNode, _DelNode);
143     FreeNode(&tmpNode);
144 }
145 void _DelNode(DNode **curNode, DNode *tmpNode)
146 {
147     if ((*curNode) == NULL)
148     {
149         return;
150     }
151     if ((*curNode)->value == tmpNode->value)
152     {
153         DNode *pNode;
154         if ((*curNode)->pre != NULL)
155         {
156             pNode = (*curNode)->pre;
157             (*curNode)->pre->next = (*curNode)->next;
158             (*curNode)->next->pre = (*curNode)->pre;
159         }
160         else
161         {
162             pNode = (*curNode)->next;
163             if ((*curNode)->next != NULL)
164             {
165                 (*curNode)->next->pre = NULL;
166 
167             }
168         }
169 
170         FreeNode(&(*curNode));
171         (*curNode) = pNode;
172     }
173 }
174 void DelAllNode(DNode **head)
175 {
176     ErgNodeEx(head, NULL, _DelAllNode);
177     //DelNode(head, (*head)->value);
178 }
179 void _DelAllNode(DNode **curNode, DNode *tmpNode)
180 {
181     if ((*curNode) == NULL)
182     {
183         return;
184     }
185     DNode *pNode;
186     pNode = (*curNode)->next;
187     (*curNode)->next->pre = NULL;
188     FreeNode(&(*curNode));
189     (*curNode) = pNode;
190 }
191 
192 void ModNode(DNode *head, int src, int dst)
193 {
194     DNode *tmpNode = NewNode(dst);
195     ErgNodeEx2(head, tmpNode, _ModNode, src);
196     FreeNode(&tmpNode);
197 }
198 void _ModNode(DNode **curNode, DNode *tmpNode, int *value)
199 {
200     if ((*curNode) == NULL)
201     {
202         return;
203     }
204     if ((*curNode)->value == (*value))
205     {
206         (*curNode)->value = tmpNode->value;
207     }
208 }
209 DNode *NewNode(int value)
210 {
211     DNode *newNode;
212     newNode = (DNode *)malloc(sizeof(DNode));
213     if (newNode != NULL)
214     {
215         newNode->next = NULL;
216         newNode->pre = NULL;
217         newNode->value = value;
218     }
219     return newNode;
220 }
221 
222 void FreeNode(DNode **node)
223 {
224     if ((*node) != NULL)
225     {
226         free((*node));
227         (*node) = NULL;
228     }
229     return;
230 }

调用:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "DNode.h"
 4 
 5 int main()
 6 {
 7     DNode *head;
 8     head = NewNode(12);
 9     AddNode(head, 1);
10     AddNode(head, 2);
11     AddNode(head, 3);
12     AddNode(head, 4);
13     PrintNode(head);
14     DelNode(&head, 12);
15     PrintNode(head);
16     ModNode(head, 4, 128);
17     PrintNode(head);
18     DNode *findtest;
19     findtest = FindNode(head, 2);
20     PrintNode(findtest);
21     DelAllNode(&head);
22     PrintNode(head);
23     system("pause");
24     return 0;
25 }

 

posted @ 2022-01-28 10:57  无限指数增长  阅读(33)  评论(0)    收藏  举报