【資料結構】設單鏈表中的資料元素遞增排列,刪除表中所有大於min且小於max的元素(使用者輸入),同時釋放被刪除節點的空間。
阿新 • • 發佈:2022-03-20
題目: 設單鏈表中的資料元素遞增排列,設計一個演算法,刪除表中所有大於min且小於max的元素,同時釋放被刪除節點的空間,並設計演算法的時間複雜度。
來源:周桂紅,等老師編寫的資料結構第五十九頁第二題
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; }node;//定義一個結構體node node *init(); void output(node *head); void delete_linklist(node *head, int min, int max); node *init()//建立單鏈表,要求使用者輸入值 { node *head = NULL; node *p = NULL; node *s = NULL; int input, certain = 1, i = 0; head = (node *)malloc(sizeof(node));//定義頭節點 if(head == NULL)//如果申請的頭節點失敗 { printf("sorry,申請空間失敗!"); exit(1);//說實話,這裡我也不清楚為什麼,借鑑小甲魚(B站up主)的。 } head->next = NULL; p = head; printf("您好,請輸入資料,我們將會輸入進去(記得由小往大),輸入0結束!\n"); while(certain) { i = i + 1; printf("請輸入第%d個數字:", i); scanf("%d", &input); if(input != 0) { s = (node *)malloc(sizeof(node)); if(s == NULL) { printf("sorry,申請空間失敗!"); exit(1); } s->data = input; p->next = s; p = p->next; } else { certain = 0; } p->next = NULL; } return head; } void output(node *head)//輸出單鏈表裡的數值 { node *p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("\r\n"); } void delete_linklist(node *head, int min, int max)//刪除單鏈表裡處於最值中間的數 { node *p = head->next; node *q; while(p != NULL) { if(p->data >= min && p->data <= max) { q->next = p->next; free(p);//這兩行的意思是將我們找到的節點給釋放 p = q->next; } else { q = p; p = p->next; } } } int main() { int min, max; node *head = NULL; head = init(); printf("您輸入的資料分別是:\n"); output(head); printf("\n"); printf("請分別輸入最小值和最大值,我們會刪除您所建立的單鏈表的二者中間的資料:"); printf("最小值:"); scanf("%d", &min); printf("最大值:"); scanf("%d", &max); delete_linklist(head, min, max); printf("\n刪除後的結果是:"); node *p = head->next;//遍歷輸出,用函式會出現莫名的bug,應該是有野指標,但由於我也不會,所以只能遍歷了 while(p != NULL) { printf("%d ", p->data); p = p->next; } return 0; }