假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C

题目有点长,反正是求交集是吧,网上的方法我看了,一般般,都是不知道怎么想出来的,晦涩难懂,这里介绍一下我自己的方法。

取A和B的交集就是取A和B中相同的元素,方法是从B中第一个元素开始,在A中依次查看是否有与他相同的元素,有就把这个值在C表中创建,没有的话接着B表下一次元素继续在A表中查看,直到B表全部元素都用上为止

要注意的是,题目要求另辟空间,也就是说不要动A和B表,网上的方法说什么把A和B合并,然后去除多余的元素,一看就有问题,题目都没理解清楚就做题。好了,下面是我的代码。

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define Elemtype int

typedef struct SList
{
    Elemtype data;
    struct SList *next;
}Node;

Node* _buynode(Elemtype x);
void initial(Node **head);
void push_back(Node **head,Elemtype x);
void show(Node *head);
Node* intersec(Node *ha,Node *hb);

int main()
{
    Node *ha,*hb,*hc;
    initial(&ha);
    initial(&hb);

    printf("构建有序链表a(-1结束)\n");
    int x;
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        push_back(&ha,x);
    }
    printf("这是链表a>>");
    show(ha);

    printf("构建有序链表b(-1结束)\n");
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        push_back(&hb,x);
    }
    printf("这是链表b>>");
    show(hb);

    printf("取交集后的链表\n");
    hc=intersec(ha,hb);
    show(hc);

    return(1);
}

Node* _buynode(Elemtype x)
{//本算法的功能是创建一个节点,其数据域赋值为x,并且返回该节点的指针
    Node *s=(Node*)malloc(sizeof(Node));
    assert(s!=NULL);

    s->data=x;
    s->next=NULL;
    return(s);
}

void push_back(Node **head,Elemtype x)
{//本算法的前提是链表已经初始化
    //本算法的功能是在链表的尾部插入一个新的节点
    Node *p=*head;
    while(p->next!=NULL)
    {
        p=p->next;
    }//p指向尾节点

    Node *s=_buynode(x);
    s->next=p->next;
    p->next=s;
    (*head)->data++;//表长加一
}

void initial(Node **head)
{//本算法的功能的是初始化一个单链表的头指针
    (*head)=(Node*)malloc(sizeof(Node));
    assert((*head)!=NULL);

    (*head)->data=0;//表长为0
    (*head)->next=NULL;
}

void show(Node *head)
{//本算法的前提是链表中至少有一个元素
    //本算法的功能是依次显示链表中的数据
    if(head->data==0)
        return;//表长的合法性判断

    Node *p=head->next;

    while(p!=NULL)
    {
        printf("%d-->",p->data);
        p=p->next;
    }
    printf("Null.\n");
}

Node* intersec(Node *ha,Node *hb)
{//本算法的前提是链表a和b的元素都是按值递增有序排列的,并且都是一个集合
    //本算法的功能是另辟一个链表C,C中的元素是链表a和b的交集,算法结束后,会返回链表
    //C的头指针
    Node *hc,*pa,*pb;
    initial(&hc);
    pa=ha->next;
    pb=hb->next;

    while(pb!=NULL)//b链表中的元素没有遍历完
    {
        while(pa!=NULL && pa->data<pb->data)
            pa=pa->next;
        if(pa!=NULL && pa->data==pb->data)
        {
            Node *s=_buynode(pb->data);
            Node *p=hc;
            while(p->next!=NULL)
                p=p->next;//寻找hc的尾节点
            s->next=p->next;
            p->next=s;//尾部插入
            hc->data++;//表长加一
        }
        pb=pb->next;
        pa=ha->next;
    }
    return(hc);
}

猜你喜欢

转载自blog.csdn.net/weixin_41133154/article/details/78804038