Game_fish 2023-04-05 20:57 采纳率: 50%
浏览 44
已结题

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

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

img

报错图片:

img

#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)
        {
            *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;
}


  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-04-05 23:46
    关注

    修改如下,供参考:

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

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 已采纳回答 4月6日
  • 创建了问题 4月5日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效