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


#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;
}

修改如下,供参考:

#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;
}