单向链表删除节点(C语言)

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