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, ¶m1); 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 }

浙公网安备 33010602011771号