簡體   English   中英

升序排序鏈表

[英]Sorting a linked list in an ascending way

我正在嘗試編寫一個將數字(來自用戶)插入節點(每個節點1個數字),然后以升序對它們進行排序的函數。 我寫了這個函數:

void insertnode(struct n_node *head)
{
    struct n_node *temp = head;
    int number;
    printf("Please insert a number to the node\n");
    scanf("%d", &number);
    while (number != SENTRY)
    {
        while ((temp->next != NULL) && (temp->next->num < number))
        {
            temp = temp->next;
        }
        struct n_node *addNode = (struct n_node*)malloc(sizeof(struct n_node));
        addNode->num = number;
        if (temp->next == NULL && number < temp->num)
        {
            addNode->next = temp;
            head = addNode;
        }
        else
        {
            addNode->next = temp->next;
            temp->next = addNode;
        }
        temp = head;
        scanf("%d", &number);
    }
    options();
}

它可以編譯,但是在我插入第一個數字后立即停止,給了我一個中斷消息並指出了這一行:

while ((temp->next != NULL) && (temp->next->num < number))

錯誤列表上沒有任何內容,感謝您的任何幫助,謝謝!

在您的算法中,您未按正確的順序測試特殊情況:

  • 如果列表為空,則headNULL ,並且測試temp->next != NULL調用未定義的行為。
  • 如果該數字小於第一個節點中的數字,則無需嘗試遍歷列表,則需要將該節點插入頭端。

您應該首先分配新節點,並通過一次測試檢查特殊情況:

 struct n_node *addNode = malloc(sizeof(struct n_node));
 addNode->num = number;

 if (head == NULL || number < head->num) {
     addNode->next = head;
     head = addNode;
 }

否則,您的迭代循環是正確的,並且當您達到錯誤條件時,將在temp之后插入節點:

    while (temp->next != NULL && temp->next->num < number) {
        temp = temp->next;
    }
    addNode->next = temp->next;
    temp->next = addNode;

循環變得更加簡單:

void insertnode(struct n_node **headp) {
    struct n_node *head = *headp;
    int number;
    printf("Please insert a number to the node\n");

    while (scanf("%d", &number) == 1 && number != SENTRY) {
        struct n_node *addNode = malloc(sizeof(struct n_node));
        if (addNode == NULL) {
            printf("out of memory\n");
            return;
        }
        addNode->num = number;

        if (head == NULL || number < head->num) {
            addNode->next = head;
            *headp = head = addNode;
        } else {
            struct n_node *temp = head;
            while (temp->next != NULL && temp->next->num < number) {
                temp = temp->next;
            }
            addNode->next = temp->next;
            temp->next = addNode;
        }
    }
    options(); // head is not passed to the function?
}

還要注意API的更改,以允許函數更新調用方范圍內的列表頭,更改后的文件停止掃描文件末尾的數字或輸入除幻數外的非數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM