zoukankan      html  css  js  c++  java
  • 基于单链表实现集合的交集、并集、差集的运算

    解题思路(单链表求交集、并集、差集的思想和顺序表求交集、并集、差集的思想基本相同)

    1.先通过CreateListR 函数将集合 a 和 b 中的元素添加到顺序表 ha 和 hb 中 ,添加过程使用的是顺序表原有的Initlist 函数(初始化表) 和 ListInsert 函数 (向表中插入元素)  。

    2.因为原集合是无序的, 所以我通过 sort 函数 (选择排序),使得集合变得有序。

    3.得到有序集合 ha 和 hb 后, 便可以使用 Union 函数(类似归并的思想写出来的求并集的函数),求出 ha 和 hb 的并集。

    4.而求交集的方法则是, 通过将 集合 a 中的元素一个一个取出,并通过 函数LocateElem ,查看集合 hb 中是否存在该元素,如果存在则将 元素放入 hc ,如果不存在,则舍去。 以此求得 两 集合的交集。

    5.求两集合的差 则可以反过来,同样通过将 集合 a 中的元素一个一个取出,并通过 函数LocateElem ,查看集合 hb 中是否存在该元素,如果不存在则将 元素放入 hc ,如果存在,则舍去。 以此求得两集合的差集。

    #include <iostream>
    #include <cstdio>
    #include <malloc.h>
    using namespace std;
    
    /* 定义单链表数据 */
    typedef char ElemType;
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LinkList;
    
    /* 单链表的初始化 */
    void InitList(LinkList *&L)
    {
        L = (LinkList *)malloc(sizeof(LinkList));
        L->next=NULL;
    }
    
    /* 向单链表中插入数据元素 */
    bool ListInsert(LinkList *&L,int x,char e)
    {
        int j = 0;
        LinkList *p = L, *s;
        while(p!=NULL && j<x-1)
        {
            p = p->next;
            j++;
        }
        if(p==NULL)
        {
            return false;
        }
        else
        {
            s = (LinkList *)malloc(sizeof(LinkList));
            s->data = e;
            s->next = p->next;
            p->next = s;
            return true;
        }
    }
    
    /* 输出单链表 */
    void DispList(LinkList *L)
    {
        LinkList *p = L->next;
        while(p!=NULL)
        {
            printf("%c ",p->data);
            p = p->next;
        }
        printf("
    ");
    }
    
    /* 求单链表的长度 */
    int ListLength(LinkList *L)
    {
        LinkList *p = L->next;
        int i = 0;
        while(p!=NULL)
        {
            i++;
            p = p->next;
        }
        return i;
    }
    
    /* 查看单链表是否为空 */
    bool ListEmpty(LinkList *L)
    {
        return L->next==NULL;
    }
    
    /* 求单链表中某个数据元素值 */
    bool GetElem(LinkList *L,int i, ElemType &e)
    {
        LinkList *p = L;
        int j = 0;
        while(p!=NULL && j < i)
        {
            p=p->next;
            j++;
        }
        if(p==NULL)
        {
            return false;
        }
        else
        {
            e = p->data;
            return true;
        }
    }
    
    /* 在单链表中查找元素 */
    int LocateElem(LinkList *L,ElemType e)
    {
        LinkList *p = L;
        int i = 0;
        while(p!=NULL && p->data!=e)
        {
            p = p->next;
            i++;
        }
        if(p==NULL)
        {
            return 0;
        }
        else
        {
            return i;
        }
    }
    
    /* 删除单链表中第 i 个元素*/
    bool ListDelete(LinkList *&L,int i,ElemType &e)
    {
        int j = 0;
        LinkList *p = L, *q;
        while(p!=NULL && j < i - 1)
        {
            p = p->next;
            j++;
        }
        if(p==NULL)
            return false;
        else
        {
            q = p->next;
            if(q==NULL)
                return false;
            e = q->data;
            p->next = q->next;
            free(q);
            return true;
        }
    }
    
    /* 删除单链表 */
    void DestroyList(LinkList *&L)
    {
        LinkList *p = L;
        LinkList *q = p->next;
        while(q!=NULL)
        {
            free(p);
            p = q;
            q = p->next;
        }
        free(p);
    }
    
    void CreateListR(LinkList *&L,ElemType e[],int n)
    {
        InitList(L);
        int i;
        for(i = 0;i < n; ++i)
        {
            if(!LocateElem(L,e[i]))
                ListInsert(L,i+1,e[i]);
        }
    }
    
    void InsterSect(LinkList *a,LinkList *b,LinkList *&c)
    {
        DestroyList(c);
        InitList(c);
        LinkList *p = a->next;
        int i = 0;
        while(p!=NULL)
        {
            if(LocateElem(b,p->data))
                ListInsert(c,++i,p->data);
            p = p->next;
        }
    }
    
    void Subs(LinkList *a,LinkList *b,LinkList *&c)
    {
        DestroyList(c);
        InitList(c);
        LinkList *p = a->next;
        int i = 0;
        while(p!=NULL)
        {
            if(!LocateElem(b,p->data))
                ListInsert(c,++i,p->data);
            p = p->next;
        }
    }
    
    void Union(LinkList *a,LinkList *b,LinkList *&c)
    {
        InitList(c);
        LinkList *p = a->next;
        LinkList *q = b->next;
        int k = 0;
        while(p!=NULL && q!=NULL)
        {
            if(p->data < q->data)
            {
                ListInsert(c,k+1,p->data);
                p = p->next;
                k++;
            }
            else if(p->data == q->data)
            {
                ListInsert(c,k+1,p->data);
                p = p->next;
                q = q->next;
                k++;
            }
            else
            {
                ListInsert(c,k+1,q->data);
                q = q->next;
                k++;
            }
        }
        while(p!=NULL)
        {
            ListInsert(c,k+1,p->data);
            p = p->next;
            k++;
        }
        while(q!=NULL)
        {
            ListInsert(c,k+1,q->data);
            q  = q->next;
            k++;
        }
        ///cout<<"hehe"<<endl;
    }
    
    void sort(LinkList *&L)
    {
        LinkList *p , *pre, *q, *k;
        InitList(p);
        int i = 0;
        char c;
        while(!ListEmpty(L))
        {
            pre = L ->next;
            c = pre->data;
            while(pre!=NULL)
            {
                if(c>=pre->data)
                    c = pre->data;
                pre = pre->next;
            }
            ListInsert(p,++i,c);
            int tag = LocateElem(L,c);
            ListDelete(L,tag,c);
        }
        L = p;
    }
    
    
    int main( )
    {
        LinkList *ha, *hb, *hc;
        ElemType a[]={'c','a','e','h'};
        ElemType b[]={'f','h','b','g','d','a'};
        printf("集合的运算如下
    ");
        CreateListR(ha,a,4);
        CreateListR(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);
        InsterSect(ha,hb,hc);
        printf("集合的交C:"); DispList(hc);
        Subs(ha,hb,hc);
        printf("集合的差C:"); DispList(hc);
        DestroyList(ha);
        DestroyList(hb);
        DestroyList(hc);
        return 0;
    }
  • 相关阅读:
    谋哥:这个时代没有比程序员更适合创业
    《人人都可以创业》连载1:创业很简单,从心开始
    谋哥:悟马道长第一句话之“不要赚屌丝的钱”
    谋哥:App开发者的苦逼不值得怜悯!
    我们都傻不啦叽为《围住神经猫》免费推广!
    谋哥:转型之痒与App推广之痛
    学习IOS开发项目篇--如何让程序在后台保持挂起状态
    学习IOS开发项目篇--SDWebImage基本使用
    学习IOS开发网络多线程篇--NSThread/GCD/
    学习IOS开发UI篇--UICollectionViewController的基本使用
  • 原文地址:https://www.cnblogs.com/mengqimoli/p/8604770.html
Copyright © 2011-2022 走看看