39-14

发布时间 2023-10-07 20:23:35作者: 正确选项

设A,B是两个带头结点的单链表,其中元素递增有序,设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A,B的结点

不破坏A,B的结点,就是赋值操作,相当于重新创建了一个单链表

#include <stdio.h>
#include <stdlib.h>

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

void TailCreate(LinkList &L)
{
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    LNode *p,*r=L;
    int x;
    scanf("%d",&x);
    while(x!=999)
    {
        p=(LNode*)malloc(sizeof(LNode));
        p->data=x;
        p->next=NULL;
        r->next=p;
        r=p;
        scanf("%d",&x);
    }
}

void displayList(LinkList L)
{
    LNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d  ",p->data);
        p=p->next;
    }
}

void Merge(LinkList A,LinkList B)
{
    LinkList C=(LNode*)malloc(sizeof(LNode));
    C->next=NULL;
    LNode *pc=C;
    LNode *pa=A->next,*pb=B->next;
    while(pa && pb)
    {
        if(pa->data<pb->data)
            pa=pa->next;
        else if(pa->data>pb->data)
            pb=pb->next;
        else if(pa->data==pb->data)
        {
            LNode *node=(LNode*)malloc(sizeof(LNode));
            node->data=pa->data;
            node->next=NULL;
            pc->next=node;
            pc=node;
            pa=pa->next;
            pb=pb->next;
        }    
    }
    displayList(C);
}

int main()
{
    LinkList A,B;
    TailCreate(A);
    displayList(A);
    printf("\n");
    TailCreate(B);
    displayList(B);
    printf("\n");
    Merge(A,B);
    
    return 0;
}