11樓的代碼,給出了單向鏈表生成、插入元素、刪除元素的操作實現,僅供參考。
授人以渔,不授人以鱼。
#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** head, Node* 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** head, Node* node) { if (node == *head) { *head = node->Next; } else { Node* previous = NULL; // 前一個元素 Node* p = *head; // 遍歷指針 while ((p != NULL) && (p != node)) { previous = p; p = p->Next; } previous->Next = node->Next; } free(node); return *head; } // 輸出結點的信息 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); } }