簡體   English   中英

刪除帶有struct元素的單鏈接列表

[英]Delete singly-linked list with struct elements

我目前在當前的任務上一直堅持執行一項任務,我不知道為什么要執行它的工作,而不是我想要的。

首先,這是作業:

提供一個單鏈列表,其定義為:

 typedef struct { char lastname[30]; char firstname[30]; } person_t; typedef struct perslistelement { person_t pers_obj; struct perslistelement *next; } PersListElement; 

a)編寫一個函數void printPerson(person_t pers)以顯示對象person_t。

b)編寫一個函數void printPersList(PersListElement * p),該函數顯示列表中的每個人。 使用函數printPerson()

c)編寫一個遞歸函數void printReversePersList(PersListElement * p),該函數以相反的順序顯示每個已保存的人。 即,最后保存的人應首先顯示,等等。使用函數printPerson()

d)編寫一個函數void deletePersList(PersListElement * p)刪除列表。

e)使用以下程序測試您的功能:

 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { char lastname[30]; char firstname[30]; } person_t; typedef struct perslistelement { person_t pers_obj; struct perslistelement *next; } PersListElement; PersListElement *insertPerson(PersListElement *first, char lastname[], char firstname[]){ PersListElement *p; p = (PersListElement*)malloc(sizeof(PersListElement)); strcpy(p->pers_obj.lastname, lastname); strcpy(p->pers_obj.firstname, firstname); p->next = first; first = p; return first; } /* Insert functions from a ) , b ) , c ) and d) ! */ int main(void){ PersListElement *p = NULL; printf("Test Program : Assignment 8 / Task 1"); printf(" Step 1: Building the list \\n" ); p = insertPerson(p, "Banner", "Bruce"); p = insertPerson(p, "Stark", "Tony"); printf("\\nStep 2: Printing the list\\n"); printPersList(p); printf("\\nStep 3: Printing the list in reverse order\\n"); printReversePersList(p); printf("\\nStep 4: Deleting the list\\n"); deletePersList(p); return 0; } 

我對a分配給c沒有任何問題。 我編寫的功能可以很好地工作,並且可以完成它們應做的事情。 但是,由於某種原因,我應該刪除列表的最后一個函數只會刪除列表元素的姓氏部分。 至少,當我在使用刪除功能后使用printPersList函數時,它的姓氏顯示為mumbo-jumbo,而名字仍保持不變。

看起來是這樣的:

見附件圖片

這是我編寫的函數:

一種)

void printPerson(person_t pers){

    printf("Last Name: %s \nFirst Name: %s\n\n", pers.lastname,pers.firstname);

}

b)

void printPersList(PersListElement *p){

    while(p != NULL) {
        printPerson(p->pers_obj);
        p = p->next;
    }
}

C)

void printReversePersList(PersListElement *p){

    if (p == NULL) return;
    printReversePersList(p->next);
    printPerson(p->pers_obj);
}

d)

void deletePersList(PersListElement *p){

    while(p != NULL) {
        free(p);
        p = p->next;
    }
}

有人可以向我解釋一下什么是錯誤以及如何解決嗎?

另外,請記住,我只是為了stackoverflow將整個任務從德語翻譯為英語,因此,如果deletePersList函數之外的地方還有其他錯誤,請忽略該內容,因為翻譯所有內容時我可能忽略了這一點。

您要釋放p ,然后使用p ,這是未定義的行為。 您需要先獲取p->next並將其存儲在temp變量中, 然后再釋放p

void deletePersList(PersListElement *p){

    while(p != NULL) {
        free(p);
        p = p->next; // this is undefined
    }
}

一個解決方案可能是

void deletePersList(PersListElement *p){
    while(p != NULL) {
        PersListElement *next = p->next;
        free(p);
        p = next; 
    }
}

暫無
暫無

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

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