qq_39677327 2022-05-04 13:52 采纳率: 94.9%
浏览 40
已结题

完善数据结构代码,解惑

设计一个程序,生成两个按值非递减有序排列的线性表LA和LB,再将LA和LB归并为一个新的线性表LC,且LC中的数据仍按值非递减有序排列,输出线性表LA、LB、LC。
用单链表来实现,以下是部分归并函数,总函数想要实现分别输入两个线性表内元素的个数,然后用rand以及srand函数赋随机值,再实现归并,有专家完善一下吗

Lnode *hb(Lnode *pa,Lnode*pb)
{
    Lnode *p,*q,*pc;
    pb=pb->next;
    pa=pa->next;
    pc=(Lnode*)malloc(sizeof(Lnode));
    p=pc; 
while(pa&&pb)
{
    q=(Lnode*)malloc(sizeof(Lnode));
    if(pb->data<pa->data)
    {
        q->data=pb->data;
        pb=pb->next;
    }
    else
    {
        q->data=pa->data;
        pa=pa->next; 
    }
    p->next=q;
    p=q;
}
while(pa)
{
    q=(Lnode*)malloc(sizeof(Lnode));
    q->data=pa->data;
    pa=pa->next;
    p->next=q;
    p=q;
}
while(pb)
{
    q=(Lnode *)malloc(sizeof(Lnode));
    q->data=pb->data;
    pb=pb->next;
    p->next=q;
    p=q;
}
p->next=NULL;
retuen(pc);
}

```

  • 写回答

2条回答 默认 最新

  • 关注

    遍历链表,在遍历的时候比较,小的先插入新链表就可以了,你的hb代码看着没有问题,那么就是在创建链表的时候,根据随机生成的数插入链表中,使之非递减。
    代码及运行结果如下:

    img

    代码:

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct lnode
    {
        int data;
        struct lnode* next;
    }Lnode;
    
    
    Lnode* inserNode(Lnode* head, Lnode* p)
    {
        Lnode* pre,*t;
        pre = head;
        t = pre->next;
        while (t)
        {
            if (t->data >= p->data)
                break;
            else
            {
                pre = t;
                t = t->next;
            }
    
        }
        if (t == 0)
        {
            pre->next = p;
        }
        else
        {
            pre->next = p;
            p->next = t;
        }
        return head;
    }
    
    
    Lnode* CreateList(int n)
    {
        int i;
        Lnode* head = (Lnode*)malloc(sizeof(Lnode));
        Lnode* t;
        head->next = 0;
        
        for (i = 0; i < n; i++)
        {
            t = (Lnode*)malloc(sizeof(Lnode));
            t->data = rand()%100; //生成0~99的整数
            t->next = 0;
            head = inserNode(head, t);
        }
        return head;
    }
    
    
    Lnode* hb(Lnode* pa, Lnode* pb)
    {
        Lnode* p, * q, * pc;
        pb = pb->next;
        pa = pa->next;
        pc = (Lnode*)malloc(sizeof(Lnode));
        p = pc;
        while (pa && pb)
        {
            q = (Lnode*)malloc(sizeof(Lnode));
            if (pb->data < pa->data)
            {
                q->data = pb->data;
                pb = pb->next;
            }
            else
            {
                q->data = pa->data;
                pa = pa->next;
            }
            p->next = q;
            p = q;
        }
        while (pa)
        {
            q = (Lnode*)malloc(sizeof(Lnode));
            q->data = pa->data;
            pa = pa->next;
            p->next = q;
            p = q;
        }
        while (pb)
        {
            q = (Lnode*)malloc(sizeof(Lnode));
            q->data = pb->data;
            pb = pb->next;
            p->next = q;
            p = q;
        }
        p->next = NULL;
        return(pc);
    }
    
    
    //显示
    void printList(Lnode* head)
    {
        Lnode* p;
        if (head == 0 || head->next == 0)
        {
            printf("链表为空\n");
            return;
        }
        else
        {
            p = head->next;
            while (p)
            {
                printf("%d ", p->data);
                p = p->next;
            }
            printf("\n");
        }
    }
    
    int main()
    {
        int m, n;
        Lnode* la=0, *lb=0,*lc=0;
        srand((unsigned int)time(NULL));
        printf("请数量链表A和链表B的长度:");
        scanf("%d %d", &m, &n);
        la = CreateList(m);
        printf("链表A:");
        printList(la);
        lb = CreateList(n);
        printf("链表B:");
        printList(lb);
        lc = hb(la, lb);
        printf("合并后的链表为:");
        printList(lc);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 修改了问题 5月4日
  • 创建了问题 5月4日

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿