代碼如下:
#include<stdio.h> #include<stdlib.h> typedef struct Node { char date; struct Node *next; }Node , *LinkList; //創建鏈表 LinkList creat_linklist(int n) { LinkList New_node,Tail_node; LinkList Head_node = NULL; char c; for (size_t i = 0; i < n; i++) { printf("請輸入在第%d個結點存入的數據:",i+1); scanf("%c",&c); fflush(stdin); New_node = (LinkList)malloc( sizeof(Node) ); New_node->date = c; New_node->next = NULL; if (Head_node == NULL) { Head_node = New_node; }else { Tail_node->next = New_node; } Tail_node = New_node; } return Head_node; } //從鏈表中刪除結點 void delelink(LinkList *List , int m) { LinkList dele_node = *List;//復制一條鏈表用於找到要刪除的結點 for (size_t i = 1; i <m ; i++)//找到要刪除的結點 { dele_node = dele_node->next; } if (m==1) {//如果要刪除的是第一個結點,就直接把頭指針連接到第二個結點上 *List = dele_node->next; free(dele_node);//注意釋放刪除的結點 }else {//如果刪除的不是第一個節點,找出要刪除結點的前一個和后一個結點並連接起來 LinkList befor_node = *List;//復制一條鏈表用於找到刪除結點的前一個結點 for (size_t i = 1; i<m-1; i++,befor_node = befor_node->next) { } befor_node->next = dele_node->next;//連接前后兩個結點 free(dele_node);//注意釋放刪除的結點 } } int main() { int n; char c; LinkList List , List2; //List用於第一次打印單鏈表,List2用於第二次打印單鏈表 printf("請輸入結點個數:"); scanf("%d",&n); fflush(stdin); List = creat_linklist(n); List2 = List;//復制一遍鏈表,第一次打印鏈表后鏈表后頭指針會直接指向NULL,導致第二次打印失敗 printf("打印單鏈表:"); while ( List != NULL ) { printf("%c" , List->date); List = List->next; } putchar('\n'); printf("請輸入要刪除的結點:"); scanf("%d",&n); fflush(stdin); delelink(&List2 , n); printf("打印單鏈表:"); while ( List2 != NULL ) { printf("%c" , List2->date); List2 = List2->next; } return 0; }
運行結果: