C 删除链表后仍在打印

C 删除链表后仍在打印,c,linked-list,C,Linked List,我在练习链表: 即使使用deleteList()函数删除了列表,我的printList()函数仍在打印整个列表,这是我的代码,我的代码有什么问题?删除函数声明或函数调用是否有问题,我的main()和printList()函数是否有错误 我搜索了互联网,也尝试了教程网站上的代码 #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next;

我在练习链表: 即使使用
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;    
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*下一步;
}节点;
作废删除列表(节点**头);
作废打印列表(节点*头);
内部主(空){
节点*prev,*head,*p;
head=NULL;
对于(int i=0;i<5;i++){
p=malloc(sizeof(node));
printf(“输入编号”);
scanf(“%i”,&p->data);
p->next=NULL;
if(head==NULL)
水头=p;
其他的
上一步->下一步=p;
prev=p;
}
删除列表(&head);
印刷品清单(标题);
自由基(p);
返回0;
}
无效打印列表(节点*头){
if(head==NULL){
printf(“\nNULL\n”);
}否则{
printf(“\n%i”,标题->数据);
打印列表(标题->下一步);
}        
}
无效删除列表(节点**头){
节点*cur=*头;
节点*nxt;
while(cur!=NULL){
nxt=cur->next;
免费(cur);
cur=nxt;
}
*head=NULL;
}

您的代码基本正确:

  • 有一个额外的
    免费(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;    
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*下一步;
}节点;
作废删除列表(节点**头);
无效打印列表(常量节点*头);
内部主(空){
node*head=NULL;
node*prev=NULL;
对于(int i=0;i<5;i++){
node*p=malloc(sizeof(node));
if(p==NULL)
返回1;
printf(“输入编号”);
如果(扫描频率(“%i”,&p->数据)!=1)
返回1;
p->next=NULL;
if(head==NULL)
水头=p;
其他的
上一步->下一步=p;
prev=p;
}
删除列表(&head);
印刷品清单(标题);
返回0;
}
无效打印列表(常量节点*头){
if(head==NULL){
printf(“空\n\n”);
}否则{
printf(“%i\n”,头部->数据);
打印列表(标题->下一步);
}
}
无效删除列表(节点**头){
节点*cur=*头;
while(cur!=NULL){
节点*nxt=cur->next;
免费(cur);
cur=nxt;
}
*head=NULL;
}

您的代码基本正确:

  • 有一个额外的
    免费(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;    
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*下一步;
}节点;
作废删除列表(节点**头);
无效打印列表(常量节点*头);
内部主(空){
node*head=NULL;
node*prev=NULL;
对于(int i=0;i<5;i++){
node*p=malloc(sizeof(node));
if(p==NULL)
返回1;
printf(“输入编号”);
如果(扫描频率(“%i”,&p->数据)!=1)
返回1;
p->next=NULL;
if(head==NULL)
水头=p;
其他的
上一步->下一步=p;
prev=p;
}
删除列表(&head);
印刷品清单(标题);
返回0;
}
无效打印列表(常量节点*头){
if(head==NULL){
printf(“空\n\n”);
}否则{
printf(“%i\n”,头部->数据);
打印列表(标题->下一步);
}
}
无效删除列表(节点**头){
节点*cur=*头;
while(cur!=NULL){
节点*nxt=cur->next;
免费(cur);
cur=nxt;
}
*head=NULL;
}

你确定吗?在添加deleteListe?
free(p)之后,如果您再次编译代码,那么medid将显示null
似乎加倍空闲(因为上次分配的
p
值存储为列表的一部分)并导致UB。您应该将
p
设置为本地循环。确定吗?在添加deleteListe?
free(p)之后,如果您再次编译代码,那么medid将显示null
似乎加倍空闲(因为上次分配的
p
值存储为列表的一部分)并导致UB。您应该将
p
local设置为循环。