删除带有结构元素的单链接列表

时间:2019-06-03 21:53:52

标签: c recursion singly-linked-list

我目前在当前的任务上一直坚持执行一项任务,我不知道为什么会执行它的工作,而不是我想要的。

首先,这是作业:

  

提供的是一个单链列表,其定义为:

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,而姓氏仍保持不变。

这是它的样子:

See attached image

以下是我编写的功能:

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函数之外的其他地方有其他错误,请忽略该错误,因为这可能是我在翻译时忽略了的东西一切。

1 个答案:

答案 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; 
    }
}