链表出现段错误怎么办??急

6-1 集合合并-(链表)
先分别输入两个链表La,Lb的结点数据(0 结束链表输入),再依次将Lb中出现的且未在La中出现的元素插入到La的后面,然后输入一个删除结点的位置,从La中将该结点删除(如果位置不存在,则输出“Position Error”)
示例:

img

报错图片:

img

#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;

// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;
struct LNode               /* 结点定义 */
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode* LinkList; /* LinkList是一指针类型,后面可用来定义结点对应的指针变量 */
 /*相关函数定义*/
 Status ListLength(LinkList L);
 void Union(LinkList *La,LinkList Lb); //将Lb合并到La中,保证La元素唯一
 Status GetElem(LinkList L,int i,ElemType *e); //获取结点i的值
 Status ListEmpty(LinkList L); //判断链表是否为空
 Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b));  /*判断L中是否有元素
与e满足compare关系。若这样的数据元素不存在,则返回值为ERROR,compare是一个函数指针变量形参 */
 Status equal(ElemType a,ElemType b); //
 Status ListInsert(LinkList *L,Status i,Status e); //
 Status ListDelete(LinkList *L,Status i,ElemType *e); //如果删除位置不存在,输出"Position Error\n"
 void input(LinkList *L); //按输入数据顺序形成链表 ,数据为0则结束输入,0不作为链表结点数据 
 void output(LinkList *L);

 int main(void)
{
    LinkList La = NULL,Lb = NULL;
    Status i;
    ElemType e;
    input(&La);
    input(&Lb);
    scanf("%d",&i);    

    Union(&La,Lb);
    output(&La);
    if(ListDelete(&La,i,&e)==ERROR)
        printf("Position Error\n");
    else 
        printf("Delete Point Value: %d\n",e);
    
    output(&La);
    return 0;
}
void output(LinkList *L)
{
    LinkList cur = *L;
    if(cur==NULL)
    {
        printf("No Chain!");
    }
    else
        while(cur)
        {
            printf("%d ",cur->data);
            cur = cur->next;
        }
    printf("\n");
}
void Union(LinkList *La,LinkList Lb)
{ // 将所有在表Lb(代表B集合)中但不在La(代表A集合)中的数据元素依次插入到La尾部
   ElemType e;
   Status i;
   Status La_len,Lb_len;
   La_len=ListLength(*La); // 求表La的长度
   Lb_len=ListLength(Lb);
   if ( !ListEmpty(Lb) ) //表Lb不为空才进行合并操作 
       for(i=1;i<=Lb_len;i++)
       {
         GetElem(Lb,i,&e); // 取表Lb中第i个数据元素赋给变量e
         if(!LocateElem(*La,e,equal)) // 表La中不存在和e相同的元素,则将e插入La中
            ListInsert(La,++La_len,e);    
       }
}
/* 请在这里填写答案 */
void input(LinkList *L)
{
    LinkList p,q;
    int t;
    scanf("%d",&t);
    while(t!=0)
    {
        p=(struct LNode *)malloc(sizeof(struct LNode));
        p->data=t;
        p->next=NULL;
        if(L==NULL)
        {
            *L=p;
            q=p;
        }
        else
        {
            q->next=p;
            q=p;
        }
        scanf("%d",&t);
    }
}
Status ListLength(LinkList L)
{
    int i=0;
    LinkList cur;
    cur=L;
    while(cur!=NULL)
    {
    i++;
    cur=cur->next;    
    }
    return i;     
}
Status GetElem(LinkList L,int i,ElemType *e)
{
    int t=1;
    LinkList cur=L;
    for(t=2;t<=i;t++)
    {
        cur=cur->next;
    }
    *e=cur->data;
    return *e;
}
Status ListEmpty(LinkList L)
{
     if(L==NULL)
     return 0;
     else
     return 1;
}
Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b))
{
    LinkList p,q;
    p=L;
    while(p!=NULL)
    {
        if(compare(p->data,e)==1)
        return 1;
        p=p->next;
    }
    return 0;
}
Status equal(ElemType a,ElemType b)
{
    if(a==b)
    return 1;
    else
    return 0;
}
Status ListInsert(LinkList *L,Status i,Status e)
{
    LinkList p,q;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data=e;
    p->next=NULL;
    q=*L;
    while(q!=NULL)
    {
        q=q->next;
    }
    q=p;
}
Status ListDelete(LinkList *L,Status i,ElemType *e)
{
    int t=2;
    LinkList p,q;
    p=*L;
    for(t=2;t<=i-1&&p!=NULL;t++)
    {
        p=p->next;
    }
    if(t==i)
    {    
    q=p->next;
    p->next=q->next;
    free(q);
    return OK;
    }
    else
    return ERROR;
}


修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;

// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;
struct LNode               /* 结点定义 */
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode* LinkList; /* LinkList是一指针类型,后面可用来定义结点对应的指针变量 */
 /*相关函数定义*/
 Status ListLength(LinkList L);
 void Union(LinkList *La,LinkList Lb); //将Lb合并到La中,保证La元素唯一
 Status GetElem(LinkList L,int i,ElemType *e); //获取结点i的值
 Status ListEmpty(LinkList L); //判断链表是否为空
 Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b));  /*判断L中是否有元素
与e满足compare关系。若这样的数据元素不存在,则返回值为ERROR,compare是一个函数指针变量形参 */
 Status equal(ElemType a,ElemType b); //
 Status ListInsert(LinkList *L,Status i,Status e);
 Status ListDelete(LinkList *L,Status i,ElemType *e); //如果删除位置不存在,输出"Position Error\n"
 void input(LinkList *L); //按输入数据顺序形成链表 ,数据为0则结束输入,0不作为链表结点数据 
 void output(LinkList *L);

 int main(void)
{
    LinkList La = NULL,Lb = NULL;
    Status i;
    ElemType e;
    input(&La);
    input(&Lb);
    scanf("%d",&i);

    Union(&La,Lb);
    output(&La);
    if(ListDelete(&La,i,&e)==ERROR)
        printf("Position Error\n");
    else
        printf("Delete Point Value: %d\n",e);

    output(&La);
    return 0;
}
void output(LinkList *L)
{
    LinkList cur = *L;
    if(cur==NULL)
    {
        printf("No Chain!");
    }
    else
        while(cur)
        {
            printf("%d ",cur->data);
            cur = cur->next;
        }
    printf("\n");
}
void Union(LinkList *La,LinkList Lb)
{ // 将所有在表Lb(代表B集合)中但不在La(代表A集合)中的数据元素依次插入到La尾部
   ElemType e;
   Status i;
   Status La_len,Lb_len;
   La_len=ListLength(*La); // 求表La的长度
   Lb_len=ListLength(Lb);
   if (!ListEmpty(Lb)) //表Lb不为空才进行合并操作
       for(i=1;i<=Lb_len;i++)
       {
         GetElem(Lb,i,&e); // 取表Lb中第i个数据元素赋给变量e
         if(!LocateElem(*La,e,equal)) // 表La中不存在和e相同的元素,则将e插入La中
            ListInsert(La,++La_len,e);
       }
}
/* 请在这里填写答案 */
void input(LinkList *L)
{
    LinkList p,q;
    int t;
    scanf("%d",&t);
    while(t!=0)
    {
        p=(struct LNode *)malloc(sizeof(struct LNode));
        p->data=t;
        p->next=NULL;
        if((*L) == NULL) //if(L==NULL)修改
        {
            (*L)=p;     //修改
            q=p;
        }
        else
        {
            q->next=p;
            q=p;
        }
        scanf("%d",&t);
    }
}
Status ListLength(LinkList L)
{
    Status i=0; //int i=0;  修改
    LinkList cur;
    cur=L;
    while(cur!=NULL)
    {
        i++;
        cur=cur->next;
    }
    return i;     
}
Status GetElem(LinkList L,int i,ElemType *e)
{
    Status t=0; //int t=1;修改
    LinkList cur=L;
    if (i == 1)
        *e=cur->data;
    else{
        while (cur && t < i - 1)//for(t=2;t<=i;t++)修改
        {
            t++;               //修改
            cur=cur->next;
        }
        *e=cur->data;
    }
    return *e;
}
Status ListEmpty(LinkList L)
{
     if(L==NULL)
         return 1; // return 0; 修改
     else
         return 0; // return 1; 修改
}
Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b))
{
    LinkList p,q;
    p=L;
    while(p!=NULL)
    {
        if(compare(p->data,e)==1)
           return 1;
        p=p->next;
    }
    return 0;
}
Status equal(ElemType a,ElemType b)
{
    if(a==b)
       return 1;
    else
       return 0;
}
Status ListInsert(LinkList* L,Status i,Status e)
{
    LinkList p,q;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data=e;
    p->next=NULL;
    q=(*L);
    if (!q)                //修改
        (*L) = p;          //修改
    else{                  //修改
        while(q->next!=NULL)//修改
        {
            q=q->next;
        }
        q->next=p;           //修改
    }
}
Status ListDelete(LinkList *L,Status i,ElemType *e)
{
    Status t=0;  //int t=2; 修改
    LinkList p,q;
    p=*L;
    if (i < 1)  return ERROR;//修改
    if (i == 1){
        (*L) = p->next;
        *e=p->data;
        free(p);
        return OK;
    }
    else{
        q = NULL;
        while (p && t < i - 1)//for(t=2;t<=i-1&&p!=NULL;t++)修改
        {
            t++;
            q = p;
            p=p->next;
        }
        if (!p)    //(t==i)修改
            return ERROR;
        *e=p->data;       //修改
        q->next = p->next;//修改
        free(p);          //修改
        return OK;
    }
    //else          修改
    //return ERROR; 修改
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^