#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(struct nodelink) struct nodelink { long num; char name[20]; struct nodelink *next; }; struct nodelink *create() { struct nodelink *head,node,end; head=(struct nodelink)malloc(LEN); end=head; for(int i=0;i<3;i++) { node=(struct nodelink)malloc(LEN); printf("请输入第%d位同学的学号姓名:\n",i+1); scanf("%ld %s",&node->num,&node->name); end->next=node; end=node; } end->next=NULL; return head; } void check(struct nodelink *head,long num) { struct nodelink *p; p=head; int flag=0; while(p!=NULL) { if(p->num==num) { printf("此为%s\n",p->name); flag=1; break; } p=p->next; } if(flag==0) printf("查无此人!\n"); } void deletes(struct nodelink *head,long num) { struct nodelink * p, * q; p = head; q = p->next; while(q != NULL) { if(q->num == num) { p->next = q->next; free(q); q = p->next; } else { p = p->next; q = q->next; } } printf("修改之后的表格为:\n"); printf("num\tname\n"); while(head!=NULL) { printf("%ld\t%s\n",head->num,head->name); head=head->next; } } int main() { long num,num1; struct nodelink *head; head=create(); printf("请输入您所要查询学生的学号:\n"); scanf("%ld",&num); check(head,num); printf("请输入您所要删除学生的学号:\n"); scanf("%ld",&num1); deletes(head,num1); return 0; }这串代码为什么删除一个链表之后输出会出现链表中没有的数据这个错误怎么修改
时间: 2023-12-07 14:05:18 浏览: 35
在删除链表节点时,你只是将节点从链表中删除了,但是没有释放节点的内存,所以在后面遍历链表时会出现错误的数据输出。你需要使用 `free()` 函数释放被删除节点的内存,修改 `deletes()` 函数如下:
```c
void deletes(struct nodelink *head,long num) {
struct nodelink *p, *q;
p = head;
q = p->next;
while(q != NULL) {
if(q->num == num) {
p->next = q->next;
free(q);
q = p->next;
} else {
p = p->next;
q = q->next;
}
}
printf("修改之后的表格为:\n");
printf("num\tname\n");
while(head!=NULL) {
printf("%ld\t%s\n",head->num,head->name);
struct nodelink *temp = head; // 临时指针保存当前节点
head = head->next; // 指向下一个节点
free(temp); // 释放当前节点的内存
}
}
```
这样,在输出完链表数据后,你需要再次遍历链表,释放节点的内存,确保不会出现内存泄漏。