1. 程式人生 > 其它 >【資料結構】設單鏈表中的資料元素遞增排列,刪除表中所有大於min且小於max的元素(使用者輸入),同時釋放被刪除節點的空間。

【資料結構】設單鏈表中的資料元素遞增排列,刪除表中所有大於min且小於max的元素(使用者輸入),同時釋放被刪除節點的空間。

題目: 設單鏈表中的資料元素遞增排列,設計一個演算法,刪除表中所有大於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;
}