在網上找了一個鏈表實現的例子,不過在一些極端情況下會導致段錯誤,我稍作修改,以下為代碼,如有更好的實現,歡迎推薦:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int ElementType; // 定義數據類型,可根據需要進行其他類型定義 // 鏈表節點的定義 typedef struct ListNode { ElementType Element; // 數據域,存放數據 struct ListNode* Next; // 指向下一個鏈表節點 }Node, *PNode; // 函數聲明 PNode CreateList(void); // 聲明創建鏈表函數 void TraverseList(PNode List); // 聲明遍歷鏈表函數 void InsertList(PNode List, int pos, int val); // 聲明鏈表插入函數 void DeleteTheList(PNode List); // 聲明刪除整個鏈表函數 void DeleteList(PNode List, int pos); // 聲明刪除鏈表元素函數 PNode FindList(PNode List); // 聲明鏈表查詢函數 // 主函數 int main() { PNode List = CreateList(); // 創建一個指針,使其指向新創建的鏈表的頭指針 TraverseList(List); // 遍歷鏈表 FindList(List); // 鏈表查詢 InsertList(List, 3, 100); // 鏈表插入,在第三個位置插入數值100 TraverseList(List); DeleteList(List, 3); // 刪除鏈表第三個節點 TraverseList(List); DeleteTheList(List); // 刪除整個鏈表 TraverseList(List); return 0; } // 創建鏈表函數定義 PNode CreateList(void) { int len ; // 用於定義鏈表長度 int val ; // 用於存放節點數值 PNode PHead = (PNode)malloc(sizeof(Node)); // 創建分配一個頭節點內存空間 if (PHead == NULL) // 判斷是否分配成功 { printf("空間分配失敗 \n"); exit(-1); } PNode PTail = PHead; // 鏈表的末尾節點,初始指向頭節點 PTail->Next = NULL; // 最后一個節點指針置為空 printf("請輸入節點個數:"); scanf("%d", &len); // 輸入節點個數 for (int i = 0; i < len; i++) { PNode PNew = (PNode)malloc(sizeof(Node)); // 分配一個新節點 if (PNew == NULL) { printf("分配新節點失敗\n"); exit(-1); } printf("請輸入第 %d 個節點的數據:", i + 1); scanf("%d", &val); // 輸入鏈表節點的數據 PNew->Element = val; // 把數據賦值給節點數據域 PTail->Next = PNew; // 末尾節點指針指向下一個新節點 PNew->Next = NULL; // 新節點指針指向為空 PTail = PNew; // 將新節點復制給末尾節點 } printf("創建鏈表成功\n"); return PHead; // 返回頭節點 } // 定義鏈表遍歷函數 void TraverseList(PNode List) { PNode P = List->Next; // 首節點賦值給臨時節點P printf("遍歷鏈表的值為:"); if (P == NULL) printf("鏈表為空"); while (P != NULL) //當臨時節點P不為尾節點時,輸出當前節點值 { printf("%d ", P->Element); P = P->Next; } printf("\n"); } // 定義鏈表查詢函數 PNode FindList(PNode List) { PNode P = List->Next; // 定義臨時指針P指向首節點的地址 int num = 0; // 用於記錄鏈表節點位置 int val = 0; // 用於存放要查詢的值 printf("請輸入要查詢的數:"); scanf("%d", &val); // 輸入要查詢的數值 while (P != NULL&&P->Element != val) { P = P->Next; ++num; } if (P != NULL) printf("找到的節點為:%d", num + 1); else printf("找不到該節點"); printf("\n"); return P; } // 定義鏈表插入函數 // 在鏈表位置第pos節點前插入包含數據val的節點 void InsertList(PNode List, int pos, int val) { int position = 0; PNode P = List; // 定義節點p指向頭節點 // 尋找pos節點的前驅結點 while (P != NULL&&position<pos - 1) { P = P->Next; ++position; } if(NULL == P) { printf("no node on pos\n"); return; } PNode Tmp = (PNode)malloc(sizeof(Node)); // 分配一個臨時節點用來存儲要插入的數據 if (Tmp == NULL) { printf("內存分配失敗!"); exit(-1); } // 插入節點 Tmp->Element = val; Tmp->Next = P->Next; P->Next = Tmp; } //定義刪除整個鏈表函數 void DeleteTheList(PNode List) { PNode P, Tmp; P = List->Next; //定義指針P指向鏈表要刪除的鏈表List的第一個點節點 List->Next = NULL; while (P != NULL) { Tmp = P->Next; //臨時Tmp指向要刪除的節點的下個節點 free(P); //釋放指針P指向的節點 P = Tmp; //重新賦值 } printf("刪除鏈表成功!\n"); } // 定義刪除鏈表元素函數 // 刪除鏈表中的第pos節點 void DeleteList(PNode List, int pos) { int position = 0; PNode P = List; // 定義一個指針p指向鏈表頭節點 // 尋找pos節點位置的前驅節點 while (P != NULL&&position < pos - 1) { P = P->Next; ++position; } // 刪除節點 if(NULL == P) { printf("No node on pos\n"); return; } PNode Tmp = P->Next; // 定義臨時指針Tmp指向要刪除的節點 P->Next = Tmp->Next; // 使要刪除節點的前驅結點指向其后驅節點 free(Tmp); // 釋放刪除節點的內存空間,防止內存泄漏 Tmp = NULL; // 使q指向空指針,防止產生野指針 }