我目前在当前的任务上一直坚持执行一项任务,我不知道为什么会执行它的工作,而不是我想要的。
首先,这是作业:
提供的是一个单链列表,其定义为:
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)编写一个无效的函数 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,而姓氏仍保持不变。
这是它的样子:
以下是我编写的功能:
a)
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;
}
}
有人可以向我解释一下什么是错误以及如何解决吗?
此外,请记住,我只是为了整个堆栈溢出而将整个任务从德语翻译成英语,因此,如果deletePersList函数之外的其他地方有其他错误,请忽略该错误,因为这可能是我在翻译时忽略了的东西一切。
答案 0 :(得分:2)
您要释放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;
}
}