《C Primer Plus 》動態鏈表刪除的一個錯誤

來源:互聯網
上載者:User

標籤:

《C Primer Plus》確實是一本偉大的書,但盡信書不如無書,作者Stephen Prata可能也希望他的讀者能找到些許他在不經意中出現的小錯誤吧! 在該書第五版17章“進階資料表示”中,程式清單17.2給出如下代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45
#define LEN sizeof(struct film)

struct film
{
        char title[TSIZE];
        int rating;
        struct film *next;
};

int main()
{
        struct film *head = NULL;
        struct film *pre, *current, *hou;
        char input[TSIZE];

        /*收集並儲存資訊*/
        puts("Enter first movie title:");
        while(gets(input) != NULL && input[0] != ‘\0‘)
        {
                current = (struct film*)malloc(LEN);
                if(head == NULL)
                {
                        head = current;
                }
                else
                {
                        pre->next = current;
                }
                current->next = NULL;
                strcpy(current->title, input);
                puts("Enter your rating<0-10>:");
                scanf("%d", ¤t->rating);
                while(getchar()!=‘\n‘)
                        continue;
                puts("Enter next movie title(empty line to stop):");
                pre = current;
        }
       
        /*給齣電影列表*/
        if(head == NULL)
        {
                printf("No data entered.");
        }
        else
        {
                printf("Here is the movie list:\n");
        }
        current = head;
        while(current != NULL)
        {
                printf("Movie:%s Rating:%d\n", current->title, current->rating);
                current = current->next;
        }
       
        /* 任務完成,因此釋放所分配空間 */
        current = head;
        while(head != NULL)
        {
                free(current);
                current = current->next;
        }

       
        printf("Bye!\n");
       
        return 0;
}
           在vc++6.0中會引發宣告失敗,調試後發現問題處在最後一部分,及“任務完成,因此釋放所分配記憶體空間部分”(文中已加粗),經過調試後,發現問題如下:
          此部分開始用current指向head,while迴圈中首先free(current),既然已經釋放掉current記憶體空間,下一步如何讓current指向current->next?所以出現宣告失敗。
          修改方法:使用另外一個指向節點的指標hold,用來儲存當前將要釋放節點的下一個節點的指標。
     
        /*
任務已完成,因此釋放所分配的記憶體 */
        current = head;
        while(current != NULL)
        {
                hold = current->next;
                free(current);
                current = hold;
        }


           
         補充:隨後在該書的程式清單17.5中就驗證了本人的想法,作者給出了一個清空鏈表的函數,基本想法一致,代碼如下:

     /*釋放由malloc()分配的記憶體*/
     /*把列表指標置為NULL*/
     void EmptyTheList(List *plist)
     {
        Node* psave;
        while(*plist != NULL)
        {
                psave = (*plist)->next;
                free(*plist);
                *plist = psave;
        }     }

《C Primer Plus 》動態鏈表刪除的一個錯誤

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.