花火ios 2021-10-03 18:03 采纳率: 100%
浏览 25
已结题

改为删除某一固定值的单链表,但为什么传不回去


#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;

LinkList L;//全局变量L;

LinkList  HEAD_INSERT()//头插法
{
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;//建立头指针
    scanf("%d",&x);
    while(x != 999)
    {
        s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域;
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
void print_list()
{

    LinkList p;
    p=L->next;//p指向单链表第一个节点
    while( p )
    {
        printf("%5d",p->data);
        p=p->next;
    }
}
LNode  *  get_pre(int i)//获得前驱节点
{
    int j=1;
    LNode *p;
    p=L->next;
    if( i == 0 )
        return L;
    if( i < 0 )
        return NULL;//参数不合法
    while ( p && j < i )
    {
        p=p->next;
        ++j;
    }
    return p;//返回查找到的前驱节点;
}
void   list_insert()//插入链表
{

    int x;
    int i;
    LNode *p,*s;
    s = (LinkList) malloc(sizeof(LNode ));
    printf("请输入要插入的数据:  \n");
    scanf("%d",&x);
    printf("请输入要插入的位置:    \n");
    scanf("%d",&i);
    s->data=x;
    p=get_pre(i-1);//记录要插位置 的前驱节点;
    s->next=p->next;//改变链表指针的指向,实现插入操作;
    p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链;


}
void   delete_list()
{
    int i;
    LNode *p;
    LNode *q,*s;
    printf("输入要删除的节点的序号:  \n");
    scanf("%d",&i);
    p=get_pre(i-1);//寻找被删除的节点的前驱;
    s=p->next;//s即为被删除的节点;
    q=p->next->next;//记录被删除节点的后继;
    p->next=q;//改变链指针的指向,删除s
    free(s);//释放被删除节点的空间;
}

void   deletex()
{
    int i;
    LNode *s;
    printf("输入要删除的节点的数字:  \n");
    scanf("%d",&i);
    while(L->next!=NULL)
    {
        if(L->data==i)
        {
            s=L;//s即为被删除的节点;
            s->next=L->next;
            L=L->next;
            free(s);//释放被删除节点的空间;

        }
            L=L->next;
    }

}
int main()
{
    printf("请输入链表(输入999结束):\n");
    HEAD_INSERT();
    printf("初始链表为:    \n");
    print_list();
    printf("\n");
    printf("删除输入值之后的链表:    \n");
    deletex();
    print_list();
    list_insert();
    printf("插入之后的链表:   \n");
    print_list();
    printf("\n");
    delete_list();
    printf("删除之后的链表:  \n");
    print_list();
    printf("\n");
    return 0;
}
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-10-03 21:32
    关注

    修改如下,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct LNode
    {
        int data;
        struct LNode *next;
    } LNode, *LinkList;
    LinkList L;//全局变量L;
    LinkList  HEAD_INSERT()//头插法
    {
        LNode *s;
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;//建立头指针
        scanf("%d",&x);
        while(x != 999)
        {
            s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域;
            s->data=x;
            s->next=L->next;
            L->next=s;
            scanf("%d",&x);
        }
        return L;
    }
    void print_list()
    {
        LinkList p;
        p=L->next;//p指向单链表第一个节点
        while( p )
        {
            printf("%5d",p->data);
            p=p->next;
        }
    }
    LNode  *  get_pre(int i)//获得前驱节点
    {
        int j=1;
        LNode *p;
        p=L->next;
        if( i == 0 )
            return L;
        if( i < 0 )
            return NULL;//参数不合法
        while ( p && j < i )
        {
            p=p->next;
            ++j;
        }
        return p;//返回查找到的前驱节点;
    }
    void   list_insert()//插入链表
    {
        int x;
        int i;
        LNode *p,*s;
        s = (LinkList) malloc(sizeof(LNode ));
        printf("请输入要插入的数据:  \n");
        scanf("%d",&x);
        printf("请输入要插入的位置:    \n");
        scanf("%d",&i);
        s->data=x;
        p=get_pre(i-1);//记录要插位置 的前驱节点;
        s->next=p->next;//改变链表指针的指向,实现插入操作;
        p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链;
     
    }
    void   delete_list()
    {
        int i;
        LNode *p;
        LNode *q,*s;
        printf("输入要删除的节点的序号:  \n");
        scanf("%d",&i);
        p=get_pre(i-1);//寻找被删除的节点的前驱;
        s=p->next;//s即为被删除的节点;
        q=p->next->next;//记录被删除节点的后继;
        p->next=q;//改变链指针的指向,删除s
        free(s);//释放被删除节点的空间;
    }
    void   deletex()
    {
        int i;
        LNode *s=NULL,*q=NULL,*p=L->next;//修改
        printf("输入要删除的节点的数字:  \n");
        scanf("%d",&i);
        while(p!=NULL)//修改
        {
            if(p->data==i) //修改
            {
                q=p;//q即为被删除的节点;
                if(p == L->next){       //修改
                   L->next = p->next;
                   p = L->next;        //p返回前一结点
                }
                else{
                   s->next = p->next;  //修改
                   p = s;              //p返回前一结点
                }
                free(q);//释放被删除节点的空间;
            }
            s = p;
            p=p->next;  //修改
        }
    }
    int main()
    {
        printf("请输入链表(输入999结束):\n");
        HEAD_INSERT();
        printf("初始链表为:    \n");
        print_list();
        printf("\n");
    
        printf("删除输入值之后的链表:    \n");
        deletex();
        print_list();
    
        list_insert();
        printf("插入之后的链表:   \n");
        print_list();
        printf("\n");
    
        delete_list();
        printf("删除之后的链表:  \n");
        print_list();
        printf("\n");
        
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 有没有办法利用libusb读取usb设备数据
  • ¥15 为什么openeluer里面按不了python3呢?
  • ¥15 关于#matlab#的问题:训练序列与输入层维度不一样
  • ¥15 关于Ubuntu20.04.3LTS遇到的问题:在安装完CUDA驱动后,电脑会进入卡死的情况,但可以通过键盘按键进入安全重启,但重启完又会进入该情况!
  • ¥15 关于#嵌入式硬件#的问题:树莓派第一天重装配置python和opencv后第二天打开就成这样,瞎捣鼓搞出来文件夹还是没把原来的界面调回来
  • ¥20 Arduino 循迹小车程序电路出错故障求解
  • ¥20 Arduino 循迹小车程序电路出错故障求解
  • ¥15 C++数组中找第二小的数字程序纠错
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)