修改一下測試用例,補充在鏈表中插入和刪除元素的功能。
運行效果:
[ 本帖最后由 TonyDeng 于 2015-3-17 17:58 编辑 ]
程序代码:
#include <stdio.h> #include <stdlib.h> #include <conio.h> // 結點數據結構 struct Node { int Value; // 數據的内容(按需要可爲任何數據類型) Node* Next; // 數據的地址 }; // 函數原型 void Pause(void); Node* InsertNode(Node* to, Node* from); Node* DeleteNode(Node* const head, Node* const node); void ShowData(const Node* node); void ListLinkData(const Node* head); void FreeLink(Node* head); // 程序主入口 int main(void) { Node* linkHead = NULL; printf_s("從數組中提取數據生成鏈表\n"); int data[] = { 1, 2, 3, 4, 5 }; Node* node = linkHead; for (int index = 0; index < _countof(data); ++index) { Node* p = (Node*)calloc(1, sizeof(Node)); p->Value = data[index]; node = InsertNode(node, p); if (linkHead == NULL) { linkHead = node; } } ListLinkData(linkHead); putchar('\n'); printf_s("在第2個元素後面插入一個新的元素\n"); node = (Node*)calloc(1, sizeof(Node)); node->Value = 10; InsertNode(linkHead->Next, node); ListLinkData(linkHead); putchar('\n'); printf_s("刪除剛才插入元素的下一個\n"); DeleteNode(linkHead, node->Next); ListLinkData(linkHead); putchar('\n'); FreeLink(linkHead); Pause(); return EXIT_SUCCESS; } // 暫停等待用戶按鍵 void Pause(void) { printf_s("\n按任意鍵繼續..."); _getch(); } // 將form元素插入在to元素後,如果to爲NULL,則將from創建爲鏈頭,返回from Node* InsertNode(Node* to, Node* from) { Node* last = NULL; if (to != NULL) { if (to->Next != NULL) { last = to->Next; } to->Next = from; from->Next = last; } return from; } // 刪除指定的結點node,返回其後的結點 // 對單向鏈表,爲了查尋前面的元素,必須從鏈表開始檢索,所以需要傳入鏈頭 Node* DeleteNode(Node* const head, Node* const node) { Node* previous = NULL; // 前一個元素 Node* p = head; // 遍歷指針 while ((p != NULL) && (p != node)) { previous = p; p = p->Next; } previous->Next = node->Next; free(node); return node->Next; } // 輸出結點的信息 void ShowData(const Node* node) { printf_s("Adress = %p, Value = %d, Next = %p\n", node, node->Value, node->Next); } // 從指定的結點開始列出鏈表數據 void ListLinkData(const Node* head) { if (head != NULL) { const Node* node = head; do { ShowData(node); node = node->Next; } while (node != NULL); } } // 刪除並釋放從指定節點開始的鏈表數據 void FreeLink(Node* head) { if (head != NULL) { Node* next; do { next = head->Next; free(head); head = NULL; head = next; } while (next != NULL); } }
運行效果:
[ 本帖最后由 TonyDeng 于 2015-3-17 17:58 编辑 ]
授人以渔,不授人以鱼。