戴戴. 2022-09-01 22:19 采纳率: 33.3%
浏览 46
已结题

删除链表中的某一节点

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

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");
}

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2022-09-01 23:00
    关注

    修改处见注释,供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 已采纳回答 9月2日
  • 创建了问题 9月1日

悬赏问题

  • ¥15 对于这个问题的代码运行
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败