[英]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.