int delect_list(link *head, int num)
{
if(head == NULL)
{
return -1;
}
link *p = NULL;
link *q = NULL;
for(q = head,p = q->next; p!=NULL;q = p, p = p->next)
{
if(p->elem == num)
{
q->next = p->next;
free(p);
}
}
return 0;
}
int main()
{
link *head = NULL;
head = Linklist_Init(head);
List_tail(head, 10);
List_tail(head, 20);
List_tail(head, 30);
List_tail(head, 40);
List_show(head);
delect_list(head, 20);
List_show(head);
return 0;
}
请问一下大佬们,我这个删除链表写的有没有问题呢,在Linux虚拟机上可以删除,并打印出来结果。用VC++6.0上运行,出错了,只打印了上面一个List_show,下面一个List_show 打印不出来,下面是VC++6.0的运行结果,正常情况下第一行打印 5 10 20 30 40 第二行打印
2 10 30 40 ,但是第二行缺没有打印出来。
你发的代码不全,没办法全面查看,调试。
if(p->elem == num)
{
q->next = p->next;
free(p);
}
---当这里满足条件后,你free(p),但并没有再给p赋值,或直接break,导致下次for循环使用p时就成野指针了。
这里在free(p)之前,要把p指向p->next
int delete_list(link *head, int num)
{
if (head == NULL)
{
return -1;
}
link *p = NULL;
link *q = NULL;
for (q = head, p = q->next; p != NULL; q = p, p = p->next)
{
if (p->elem == num)
{
q->next = p->next;
link *t = p;
p = q;
free(t);
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct Link
{
int elem;
struct Link *next;
}link;
//链表初始化
link *Linklist_Init(link *head)
{
head = (link *)malloc(sizeof(link));
head->elem = 5;
head-> next = NULL;
return head;
}
//尾部插入
int List_tail(link *head, int num)
{
if(head == NULL)
{
return -1;
}
//1、申请节点
link *p = NULL;
p = (link *)malloc(sizeof(link));
if(p == NULL)
{
printf("节点申请失败!");
return -1;
}
//2、为节点赋值
p->elem = num;
p->next = NULL;
//3、不能将p赋值给head->next,应该在申请一个指针节点,遍历链表
link *q = NULL;
q = (link *)malloc(sizeof(link));
for(q = head; q->next != NULL; q = q->next)
{
}
q->next = p; //将q的next指向要插入的节点
return 0;
}
//头部插入
int List_head(link *head, int num)
{
if(head == NULL)
{
return -1;
}
//1、申请节点
link *p = NULL;
p = (link *)malloc(sizeof(link));
if(p == NULL)
{
printf("节点申请失败!");
return -1;
}
//2、为节点赋值
p->elem = num;
p->next = head->next;
head->next = p;
return 0;
}
//遍历链表
int List_show(link *head)
{
if(head == NULL)
{
return -1;
}
link *p = NULL;
for(p = head; p!=NULL; p = p->next)
{
printf("%d ", p->elem);
}
printf("\n");
return 0;
}
//查找链表
int search_list(link *head, int num)
{
if(head == NULL)
{
return -1;
}
link *p = NULL;
for(p = head; p!=NULL; p = p->next)
{
if(p->elem == num)
{
printf("%d ", p->elem);
}
}
printf("\n");
printf("没找到!\n");
return 0;
}
//删除节点
int delete_list(link *head, int num)
{
if(head == NULL)
{
return -1;
}
link *p = NULL;
link *q = NULL;
for(q = head,p = q->next; p!=NULL;q = p, p = p->next)
{
if(p->elem == num)
{
q->next = p->next;
free(p);
}
}
return 0;
}
int main()
{
link *head = NULL;
head = Linklist_Init(head);
List_tail(head, 10);
List_tail(head, 20);
List_tail(head, 30);
List_tail(head, 40);
List_show(head);
delete_list(head, 20);
List_show(head);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632