花火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日

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题