AC_wy 2023-03-26 20:00 采纳率: 83.3%
浏览 59
已结题

求两个集合的合并运算链表法

又输出不了....目前觉得应该是ListInsert问题


```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
struct LNode     /*结点定义*/
{
    ElemType data;
    struct LNode *next;
};
typedef struct LNode *LinkList;/*表的头指针类型*/
LinkList CreateList();
int ListLength(LinkList L);
Status GetElem(LinkList L,int i,ElemType *e);
Status LocateElem(LinkList L,ElemType e,int compare(ElemType x, ElemType y));
int compare(ElemType x,ElemType y);
void ListInsert(LinkList *L,ElemType i,ElemType e);
Status ListEmpty(LinkList L);
void Union(LinkList *La,LinkList Lb);
int main()
{
    LinkList q;
    LinkList La,Lb;
    La=CreateList();
    Lb=CreateList();
    if(!ListEmpty(La)&&!ListEmpty(Lb))
        Union(&La,Lb);
    q=La;
    while(q!=NULL)
    {
        printf("%d ",q->data);
        q=q->next;
    }
    return 0;
}



/*创建链表*/
LinkList CreateList()
{
    char ch;
    struct LNode *head=NULL,*p1,*p2;
    while(1)
    {
        p1=(LinkList)malloc(sizeof(LNode));
        p1->next=NULL;
        scanf("%d%c",&p1->data,&ch);
        if(head==NULL)
        {
            head=p1;
            p2=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
        }
        if(ch=='\n')
            break;
    }
    return head;
}

/*单链表长度*/
int ListLength(LinkList L)
{
    int i=0;
    struct LNode *p;
    p=L;
    while(p)
    {
        p=p->next;
        i++;
    }
    return i;
}

/* *L为单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
Status GetElem(LinkList L,int i,ElemType *e)
{
    int j=1;    /*j为计数器*/
    LinkList p=L;/* p指向第一个结点*/
    while(p&&j<i)      /*顺指针向后查找,直到p指向第i个元素或p为空*/
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return ERROR;
    *e=p->data;    /*取第i个元素*/
    return OK;
}



Status LocateElem(LinkList L,ElemType e,int compare(ElemType x, ElemType y))
{
    int i=1;
    LinkList p;
    p=L;
    for(i=0;i<ListLength(L);i++)
    {
        if(compare(p->data,e))
            return i;
        p=p->next;
    }
    return FALSE;
}

int compare(ElemType x,ElemType y)
{
    if(x==y)
        return TRUE;
    else
        return FALSE;
}



void ListInsert(LinkList *L,ElemType i,ElemType e)
{
    LinkList p,p1,p2;
    p1=*L;
    p2=*L;
    p->data=e;
    if(i==ListLength(*L))
    {
        while(p1!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        p2->next=p;
        p->next=NULL;
    }
    else
    {
        if(i-1==0)
        {
            p->next=p1;
            *L=p;
        }
        else
        {
            if(i-1==0)
            {
                p->next=p1;
                *L=p;
            }
            else
            {
                p->next=p1;
                p2->next=p;
            }
        }
    }
}

/*若L为空表,则返回TRUE,否则返回FALSE*/
Status ListEmpty(LinkList L)
{
    if(L->next)
      return FALSE;
    else
      return TRUE;
}


void Union(LinkList *La,LinkList Lb)
{
    ElemType e;
    int La_len,Lb_len;
    int i;
    La_len=ListLength(*La);
    Lb_len=ListLength(Lb);
    for(i=1;i<=Lb_len;i++)
    {
        GetElem(Lb,i,&e);
        if(!LocateElem(*La,e,compare))
            ListInsert(La,++La_len,e);
    }
}




```

  • 写回答

3条回答 默认 最新

  • IT_service_mesh 2023-03-26 20:07
    关注

    参考GPT和自己的思路:你的代码存在几个问题:

    1.在ListInsert函数中,p指针没有被初始化,直接使用会出现不可预知的结果。应该先给p分配内存,例如:LinkList p=(LinkList)malloc(sizeof(LNode));

    2.在ListInsert函数中,如果要在非末尾位置插入元素,需要分别记录p1和p2指针指向待插入位置前后的结点。你的代码中只有p1和p2都指向了头结点,无法正确处理非末尾位置的插入。

    3.在调用Union函数时,应该先判断La和Lb是否为空,否则可能会出现不可预知的结果。

    修正后的代码如下:

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月3日
  • 创建了问题 3月26日

悬赏问题

  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。
  • ¥15 GitHubssh虚拟机连接不上
  • ¥15 装完kali之后下载Google输入法 重启电脑后出现以下状况 且退不出去 桌面消失 反复重启没用
  • ¥15 ESP-IDP-BLE配网连接wifi