删除链接列表后,它仍在打印

时间:2017-10-01 10:03:40

标签: c linked-list

我在练习链表: 即使在使用deleteList()函数删除列表后,我的printList()函数仍在打印整个列表,这是我的代码,我的代码有什么问题?是删除函数声明或函数调用中的问题,我的main()printList()函数中是否有错误?

我搜索了互联网并尝试了教程网站的代码。

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
} node;

void deleteList(node **head);   
void printList(node *head);

int main(void) {
    node *prev, *head, *p;
    head = NULL;

    for (int i = 0; i < 5; i++) {
        p = malloc(sizeof(node));
        printf("Enter number\n");
        scanf("%i", &p->data);
        p->next = NULL;
        if (head == NULL)
            head = p;
        else
            prev->next = p;
        prev = p;
    }
    deleteList(&head);
    printList(head);
    free(p);
    return 0;
}

void printList(node *head) {
    if (head == NULL) {
        printf("\nNULL\n");  
    } else {
        printf("\n%i", head->data);
        printList(head->next);
    }        
}

void deleteList(node **head) {
    node *cur = *head;
    node *nxt;

    while (cur != NULL) {
        nxt = cur->next;
        free(cur);
        cur = nxt;
    }
    *head = NULL;    
}

1 个答案:

答案 0 :(得分:0)

您的代码大部分都是正确的:

  • free(p);末尾有一个额外的main()导致未定义的行为,因为该节点已被deleteList()释放。
  • 您应检查malloc()scanf()的返回值,以避免在未能分配内存或无法从输入流转换整数时出现未定义的行为。

除了这些问题之外,代码应该在释放列表后始终打印NULL

以下是改进版本:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
} node;

void deleteList(node **head);   
void printList(const node *head);

int main(void) {
    node *head = NULL;
    node *prev = NULL;

    for (int i = 0; i < 5; i++) {
        node *p = malloc(sizeof(node));
        if (p == NULL)
            return 1;
        printf("Enter number\n");
        if (scanf("%i", &p->data) != 1)
            return 1;
        p->next = NULL;
        if (head == NULL)
            head = p;
        else
            prev->next = p;
        prev = p;
    }
    deleteList(&head);
    printList(head);
    return 0;
}

void printList(const node *head) {
    if (head == NULL) {
        printf("NULL\n\n");
    } else {
        printf("%i\n", head->data);
        printList(head->next);
    }
}

void deleteList(node **head) {
    node *cur = *head;

    while (cur != NULL) {
        node *nxt = cur->next;
        free(cur);
        cur = nxt;
    }
    *head = NULL;    
}