The data structure uses a singly linked list to represent the union and intersection of sets

#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<cstdio>
using namespace std;
typedef char ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LinkList;
void DispList(LinkList*L)
{
    LinkList *p=L->next;
    while(p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}
void DestroyList(LinkList *&L)
{
    LinkList*p=L->next,*pre=L;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);
}
///尾插法建表
void CreatListR(LinkList *&L,ElemType a[],int n)
{
    LinkList *s,*r;
    L=(LinkList*)malloc(sizeof(LinkList));
    r=L;
    for(int i=0; i<n; i++)
    {
        s=(LinkList*)malloc(sizeof(LinkList));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
///从小到大排序
void sort(LinkList *&L)
{
    LinkList *pre,*p,*q;
    p=L->next->next;
    L->next->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        pre=L;
        while(pre->next!=NULL&&pre->next->data<p->data)
            pre=pre->next;
        p->next=pre->next;
        pre->next=p;
        p=q;
    }
}
///求集合的并
void Union(LinkList *ha,LinkList*hb,LinkList*&hc)
{
    LinkList *pa=ha->next,*pb=hb->next,*pc,*s;
    hc=(LinkList*)malloc(sizeof(LinkList));
    pc=hc;
    while(pa!=NULL &&pb!=NULL )
    {
        if(pa->data<pb->data)
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->data=pa->data;
            pc->next=s;
            pc=s;
            pa=pa->next;
        }
        else if(pa->data>pb->data)
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->data=pb->data;
            pc->next=s;
            pc=s;
            pb=pb->next;
        }
        else
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->data=pa->data;
            pc->next=s;
            pc=s;
            pa=pa->next;
            pb=pb->next;
        }
    }
    if(pb!=NULL)
        pa=pb;
    while(pa!=NULL)
    {
        s=(LinkList*)malloc(sizeof(LinkList));
        s->data=pa->data;
        pc->next=s;
        pc=s;
        pa=pa->next;
    }
    pc->next=NULL;
}
///求两个有序集合的交用尾插法
void InterSect(LinkList *ha,LinkList*hb,LinkList*&hc)
{
    LinkList *pa=ha->next,*pb,*pc,*s;
    hc=(LinkList*)malloc(sizeof(LinkList));
    pc=hc;
    while(pa!=NULL)
    {
        pb=hb->next;
        while(pb!=NULL&&pb->data<pa->data)
            pb=pb->next;
        if(pb!=NULL &&pb->data==pa->data)///B节点在A节点中复制A节点
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->data=pa->data;
            pc->next=s;
            pc=s;
        }
        pa=pa->next;
    }
    pc->next=NULL;
}
///求两个有序集合的差
void Subs(LinkList *ha,LinkList*hb,LinkList*&hc)
{
    LinkList *pa=ha->next,*pb,*pc,*s;
    hc=(LinkList*)malloc(sizeof(LinkList));
    pc=hc;
    while(pa!=NULL)
    {
        pb=hb->next;
        while(pb!=NULL&&pb->data<pa->data)
            pb=pb->next;
        if(!(pb!=NULL &&pb->data==pa->data))///B节点不在A节点中复制A节点
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->data=pa->data;
            pc->next=s;
            pc=s;
        }
         pa=pa->next;
    }
    pc->next=NULL;
}
int main()
{
    LinkList *ha,*hb,*hc;
    ElemType a[]= {'c','a','e','h'};
    ElemType b[]= {'f','h','b','g','d','a'};
    printf(" 集合的运算如下:\n");
    CreatListR(ha,a,4);
    CreatListR(hb,b,6);
    printf(" 原集合A: ");
    DispList(ha);
    printf(" 原集合B: ");
    DispList(hb);
    sort(ha);
    sort(hb);
    printf(" 有序集合A: ");
    DispList(ha);
    printf(" 有序集合B: ");
    DispList(hb);
    Union(ha,hb,hc);
    printf(" 集合的并C: ");
    DispList(hc);
    InterSect(ha,hb,hc);
    printf(" 集合的交C: ");
    DispList(hc);
    Subs(ha,hb,hc);
    printf(" 集合的差C: ");
    DispList(hc);
    DestroyList(ha);
    DestroyList(hb);
    DestroyList(hc);
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326348344&siteId=291194637