gpt4 book ai didi

c - 删除带有结构元素的单链表

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:43 25 4
gpt4 key购买 nike

我目前被当前任务中的一项任务困住了,我不知道为什么它会做它做的事情,而不是我想要的。

首先,这是作业:

Provided is a singly linked list, which is defined as:

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

a) Write a function void printPerson(person_t pers) to display an object person_t.

b) Write a function void printPersList(PersListElement *p) which displays every person within the list. Use the function printPerson()

c) Write a recursive function void printReversePersList(PersListElement *p), which displays every saved person in reverse order. I.e. the person which was saved last should be displayed first, etc.. Use the function printPerson()

d) Write a function void deletePersList(PersListElement *p) which deletes a list.

e) Test your functions with the following program:

#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 功能时,它会将姓氏显示为胡言乱语,而名字仍然完好无损。

这是它的样子:

See attached image

下面是我写的函数:

一)

void printPerson(person_t pers){

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

}

二)

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

之前,您需要获取 p->next 并将其存储在临时变量或其他东西中
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;
}
}

关于c - 删除带有结构元素的单链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56434994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com