兔子不恰胡萝卜 2022-03-25 22:04 采纳率: 75%
浏览 245
已结题

设有两个线性表A和B皆是单链表存储结构。 同一个表中的元素各不相同,且递增有序。 写一算法,构成一个新的线性表C,使C为A和B的交集,且C中元素也递增有序。

数据结构的习题

//设有两个线性表A和B皆是单链表存储结构。
//同一个表中的元素各不相同,且递增有序。
//写一算法,构成一个新的线性表C,使C为A和B的交集,且C中元素也递增有序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int ElemType;
typedef struct node
{
    ElemType data;
    struct node* next;
}LNode, * LinkList;

void CreLinkListTail(LinkList L, int n)
{
    LNode* s, * r;
    ElemType x;
    int i;
    r = L;
    printf("输入结点:\n");
    for (i = n; i > 0; i--)
    {
        scanf_s("%d", &x);
        s = (LNode*)malloc(sizeof(LNode));
        s->next = NULL;//
        s->data = x;
        r->next = s;
        r = s;
    }
}

void OutPut(LinkList L)
{
    LNode* p;
    p = L;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void linkedlist_delete(LinkList La, LinkList Lb, LinkList Lc)
{
    LNode* pa, * pb, * pc, * q, * u;
    pa = La->next;
    pb = Lb->next;
    pc = Lc = La;
    while (pa && pb)
    {
        if (pa->data == pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
            u = pb;
            pb = pb->next;
            free(u);
        }
        else if (pa->data < pb->data)
        {
            u = pa;
            pa = pa->next;
            free(u);
        }
        else
        {
            u = pb;
            pb = pb->next;
            free(u);
        }
    }
    while (pa)
    {
        u = pa;
        pa = pa->next;
        free(u);
    }

    while (pb)
    {
        u = pb;
        pb = pb->next;
        free(u);
    }

    pc->next = NULL;  

    free(Lb);   
}

void main()
{
    int n = 0;
    scanf_s("%d", &n);
    LinkList La = (LinkList)malloc(sizeof(LNode));
    La->next = NULL;

    CreLinkListTail(La, n);
    printf("带头结点尾插法--输出建立后的单链表:\n");
    OutPut(La->next);

    LinkList Lb = (LinkList)malloc(sizeof(LNode));
    Lb->next = NULL;

    CreLinkListTail(Lb, n);
    printf("带头结点尾插法--输出建立后的单链表:\n");
    OutPut(Lb->next);

    LinkList Lc = (LinkList)malloc(sizeof(LNode));
    Lc->next = NULL;

    CreLinkListTail(Lc, n);

    printf("输出归并后的Lc单链表:\n");
    linkedlist_delete(La, Lb, Lc);
    OutPut(Lc->next);
}

希望能帮忙改进一下代码,错的地方注释出来并优化一下,希望可以详细注释一下

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-03-26 15:45
    关注

    修改处见注释,供参考:

    //设有两个线性表A和B皆是单链表存储结构。
    //同一个表中的元素各不相同,且递增有序。
    //写一算法,构成一个新的线性表C,使C为A和B的交集,且C中元素也递增有序。
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    typedef int ElemType;
    typedef struct node
    {
        ElemType data;
        struct node* next;
    }LNode, * LinkList;
    
    void CreLinkListTail(LinkList L, int n)
    {
        LNode* s, * r;
        ElemType x;
        int i;
        r = L;
        printf("输入结点:\n");
        for (i = n; i > 0; i--)
        {
            scanf("%d", &x);
            s = (LNode*)malloc(sizeof(LNode));
            s->next = NULL;//
            s->data = x;
            r->next = s;
            r = s;
        }
    }
     
    void OutPut(LinkList L)
    {
        LNode* p;
        p = L;
        while (p)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    void linkedlist_delete(LinkList La, LinkList Lb, LinkList Lc)
    {
        LNode* pa, * pb, * pc, * q, * u;
        pa = La->next;
        pb = Lb->next;
        pc = Lc ;//= La; 修改
        while (pa && pb)
        {
            if (pa->data == pb->data)
            {
                q = (LinkList)malloc(sizeof(LNode)); //修改
                q->next = NULL;                  //修改
                q->data = pa->data;              //修改
                pc->next = q;                    //修改
                pc = q;
                pa = pa->next;
                //u = pb;                        //修改
                pb = pb->next;
                //free(u);                       //修改
            }
            else if (pa->data < pb->data)
            {
                //u = pa;                        //修改
                pa = pa->next;
                //free(u);                       //修改
            }
            else
            {
                //u = pb;                         //修改
                pb = pb->next;
                //free(u);                        //修改
            }
        }
        //while (pa)                             //修改
        //{
        //    u = pa;
        //    pa = pa->next;
        //    free(u);
        //}
    
        //while (pb)
        //{
        //    u = pb;
        //    pb = pb->next;
        //    free(u);
        //}
     
        //pc->next = NULL;
     
        //free(Lb);
    }
     
    void main()
    {
        int n = 0;
        scanf("%d", &n);
        LinkList La = (LinkList)malloc(sizeof(LNode));
        La->next = NULL;
     
        CreLinkListTail(La, n);
        printf("带头结点尾插法--输出建立后的单链表:\n");
        OutPut(La->next);
    
        LinkList Lb = (LinkList)malloc(sizeof(LNode));
        Lb->next = NULL;
     
        CreLinkListTail(Lb, n);
        printf("带头结点尾插法--输出建立后的单链表:\n");
        OutPut(Lb->next);
    
        LinkList Lc = (LinkList)malloc(sizeof(LNode));
        Lc->next = NULL;
    
        //CreLinkListTail(Lc, n);  修改
    
        printf("输出归并后的Lc单链表:\n");
        linkedlist_delete(La, Lb, Lc);
        OutPut(Lc->next);
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 修改了问题 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥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之后自动重连失效