删除链表中的某一节点

我写的一个链表,采用的是尾插法,其中进行删除操作。
为什么不能删除第一个节点的数据?其他的节点就可以。

img

img

代码如下:

#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
    int data;
    struct node *next;
}Node;
Node *head=NULL;
void winsert(int x)  //插入节点,尾插法
{
    Node *temp=(Node *)malloc(sizeof(Node));
    Node *list=head;
    temp->data=x;
    temp->next=NULL;
    if(head==NULL)
    {
        head=temp;

    }
    else
   { while(list->next!=NULL)
    {
        list=list->next;
    }
    list->next=temp;
   }

}
void Print()  //输出链表
{
    Node *temp=head;
    while(temp)
    {
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
}
int dele(int x) //删除节点
{
    Node *front=head;
    Node *temp=head;
    while(temp)
    {   if(temp->data==x)
        { front->next=temp->next;
         free(temp);
        return true;
        }
        front=temp;
        temp=temp->next;
    }
    return false;
   
}
int main()
{   int x;
    printf("请输入要插入的数,直到负数结束:");
    while(1)
    {
        scanf("%d",&x);
        if(x<0)
        break;
        winsert(x);
    }
    printf("数据输入完成 ");
    Print();
    printf("请输入要删除的数:");
    scanf("%d",&x);
    if(dele(x))
   { printf("数据已删除:");
    Print();}
    else
    printf("删除失败\n");
}

修改处见注释,供参考:

#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
    int data;
    struct node *next;
}Node;
Node *head=NULL;
void winsert(int x)  //插入节点,尾插法
{
    Node *temp=(Node *)malloc(sizeof(Node));
    Node *list=head;
    temp->data=x;
    temp->next=NULL;
    if(head==NULL)
    {
        head=temp;

    }
    else
   {
       while(list->next!=NULL)
       {
           list=list->next;
       }
       list->next=temp;
   }

}
void Print()  //输出链表
{
    Node *temp=head;
    while(temp)
    {
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
}
int dele(int x) //删除节点
{
    Node *front=head;
    Node *temp=head;
    while(temp && temp->data != x) //修改
    {
        //if(temp->data==x)
        //{
        //    front->next=temp->next;
        //    free(temp);
        //    return true;
        //}
        front=temp;
        temp=temp->next;
    }
    if (!temp) return false;  //修改
    if (temp == head)         //修改
        head = temp->next;
    else                      //修改
        front->next=temp->next;
    free(temp);
    return true;
}
int main()
{   int x;
    printf("请输入要插入的数,直到负数结束:");
    while(1)
    {
        scanf("%d",&x);
        if(x<0)
            break;
        winsert(x);
    }
    printf("数据输入完成 ");
    Print();
    printf("请输入要删除的数:");
    scanf("%d",&x);
    if(dele(x))
    {
        printf("数据已删除:");
        Print();
    }
    else
        printf("删除失败\n");
    return 0;
}

请问:头节点前面有没有节点?如果要删除的刚好是头节点,就把下一节点设置为头节点。


#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
    int data;
    struct node *next;
}Node;
Node *head=NULL;
void winsert(int x)  //插入节点,尾插法
{
    Node *temp=(Node *)malloc(sizeof(Node));
    Node *list=head;
    temp->data=x;
    temp->next=NULL;
    if(head==NULL)
    {
        head=temp;
 
    }
    else
   { while(list->next!=NULL)
    {
        list=list->next;
    }
    list->next=temp;
   }
 
}
void Print()  //输出链表
{
    Node *temp=head;
    while(temp)
    {
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
}
int dele(int x) //删除节点
{
    Node *front=head;
    Node *temp=head;
    while(temp)
    {   
        if(temp->data==x)
        {
            // 判断是否是头节点
            if(temp == head){ 
                head = temp->next;
            }else {
                front->next = temp->next;
            }
            free(temp);
            return true;
        }
        front=temp;
        temp=temp->next;
    }
    return false;
   
}
int main()
{   int x;
    printf("请输入要插入的数,直到负数结束:");
    while(1)
    {
        scanf("%d",&x);
        if(x<0)
        break;
        winsert(x);
    }
    printf("数据输入完成 ");
    Print();
    printf("请输入要删除的数:");
    scanf("%d",&x);
    if(dele(x))
   { printf("数据已删除:");
    Print();}
    else
    printf("删除失败\n");
}
 

img

因为第一个节点中的next指向下一个节点,你释放了他的空间,自然就没有指针指向next指向的节点了
可以看看我的链表文章

问题很简单,假如你第一个head 就满足你的条件呢?你那样写不对的

把del 里面的if 判断稍微调整下:

        if(temp->data==x) //找到节点
        {
            if (temp == head) { //首先确定是不是head
                head = temp->next;
            } else { // 中间没有问题
               front->next=temp->next;
            }
         free(temp);
        return true;
        }