顺序表:两集合的交集

【项目 - 求集合并集】
  假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。设计算法,用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B,即将两个集合的并集放在线性表LC中。

 
list.h
 
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

/*
* Copyright (c) 2015, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp,hanshu.cpp,list.h
* 作者:徐吉平
* 完成日期:2015年9月21日
* 版本号:code ::Block 13.12
*
* 问题描述:顺序表:两集合的交集 
* 输入描述:无
* 程序输出:线性表的结果
*/

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50    //Maxsize将用于后面定义存储空间的大小
typedef int ElemType;  //ElemType在不同场合可以根据问题的需要确定,在此取简单的int
typedef struct
{
    ElemType data[MaxSize];  //利用了前面MaxSize和ElemType的定义
    int length;
}SqList;

void unionList(SqList *LA, SqList *LB, SqList *&LC);


void InitList(SqList *&L);//初始化链表
void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表

bool ListInsert(SqList *&L,int i,ElemType e) ;//插入数据元素ListInsert(L,i,e)
int ListLength(SqList *L);//求线性表的长度ListLength(L)
bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)
bool ListEmpty(SqList *L);//判断线性表是否为空
void DispList(SqList *L);//输出线性表
void DestroyList(SqList *&L);//销毁线性表DestroyList(L)

#endif // LIST_H_INCLUDED

hanshu.cpp

#include "list.h"

void unionList(SqList *LA, SqList *LB, SqList *&LC)
{
    int lena;
    ElemType e;
    InitList(LC);
    for(int i=1;i<=LA->length;i++)
    {
        GetElem(LA,i,e);
        ListInsert(LC,i,e);
    }

    for(int i=1;i<=LB->length;i++)
    {
        GetElem(LB,i,e);         //取LB中第i个数据元素赋给e
        if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中
            ListInsert(LC,++lena,e);

    }
}

//初始化线性表InitList(L)

void InitList(SqList *&L)
{
   L=(SqList *)malloc(sizeof(SqList));
   L->length=0;
}
//用数组创建线性表CreateList(SqList L, ElemType a, int n)
void CreateList(SqList *&L, ElemType a[], int n)
{
    int i;
    L=(SqList *)malloc(sizeof(SqList));
    for (i=0; i<n; i++)
        L->data[i]=a[i];
    L->length=n;
}
//插入数据元素ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i,ElemType e)
{
    int j;
    if(i<1||i>L->length+1)
    {
            return false;
    }
    i--;
    for(j=L->length;j>i;j--)
    {
        L->data[j]=L->data[j-1];
    }
    L->data[i]=e;
    L->length++;
    return true;
}
//求线性表的长度ListLength(L)
int ListLength(SqList *L)
{
    return(L->length);
}
//求某个数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i,ElemType &e)
{
    if (i<1 || i>L->length)  return false;
    e=L->data[i-1];
    return true;
}
//按元素值查找LocateElem(L,e)
int LocateElem(SqList *L, ElemType e)
{
    int i=0;
    while (i<L->length && L->data[i]!=e) i++;
    if (i>=L->length)  return 0;
    else  return i+1;
}
//删除数据元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{
    int j;
    if (i<1 || i>L->length)  //参数错误时返回false
        return false;
    i--;        //将顺序表逻辑序号转化为物理序号
    e=L->data[i];
    for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
        L->data[j]=L->data[j+1];
    L->length--;              //顺序表长度减1
    return true;              //成功删除返回true
}
//判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
    return (L->length==0);
}
//输出线性表DispList(L)
void DispList(SqList *L)
{
    int i;
    if(ListEmpty(L))
        return ;
    for (i=0;i<L->length;i++)
        printf("%d ",L->data[i]);
    printf("\n");
}
//销毁线性表DestroyList(L)
void DestroyList(SqList *&L)
{
    free(L);
}


main.cpp

#include <stdio.h>
#include "list.h"

int main()
{
    SqList *sq_a,*sq_b,*sq_c;
    ElemType a[10]={0,1,2,3,4,5,6,7,8,9};
    ElemType b[10]={5,6,7,8,9,10,11,12,13,14};

    CreateList(sq_a, a, 10);
    CreateList(sq_b,b,10);

    printf("顺序表sq_a为:");
    DispList(sq_a);

    printf("顺序表sq_b为:");

    DispList(sq_b);

    unionList(sq_a, sq_b,sq_c);

    printf("顺序表sq_c为:");

    DispList(sq_c);

    return 0;
}

总结体会:该项目充分的利用了算法库的函数,使项目的编写大大简化了,unionList(sq_a, sq_b,sq_c)函数编写时由于对顺序表sq_c没有初始化,程序始终无法运行。后来经过老师指正后,虽然程序能运行了,但结果却不正确,经过反复查找问题发现,将sq_a复制给sq_c的语句是不对的,因为sq_c的长度是不是固定的,用sq_c->data[i]=sq_a->data[i]是不行的,只能通过先提取数据元素再插入到sq_c的方式才能解决sq_c的长度问题,所以问题终于解决了顺序表:两集合的交集_第1张图片

你可能感兴趣的:(数据结构,算法,合并,库,计算机科学)