4. 基本操作(集合合并)

题目

我们讨论一个如何使用基本运算将两个集合合并的问题。下面,是采用基本操作完成集合合并的操作。

问题: 线性表的合并A=A∪B
设:有两个集合A和B分别用两个线性表LA和LB表示。求一个新的集合 A=A∪B。

输入:两个集合

输出:按照要求合并后的集合。

编程要求:题目中已经给出了主函数和部分已经实现的基本操作,请阅读给出的程序,编写其他尚未完成的基本操作(基本操作的定义请参见严蔚敏老师的教材)。

注意:提交代码的时候,仅需提交你编写的那三个基本操作函数即可。

预设代码

前置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
 
#include   
#include   
#define LIST_MAX_SIZE  100  //空间初始大小  
#define OK 1  
#define ERROR 0  
  
typedef int ElemType;       //元素的数据类型  
typedef int Status;         //状态。函数返回值   
typedef struct {  
//  ElemType elem[ LIST_MAX_SIZE ]; // 存储空间  
    ElemType * elem;    // 存储空间  
    int  length;        // 当前元素个数  
    int  listsize;      // 能够保存的最大元素数量   
} SqList;  
  
// 以下为函数原型   
Status InitList( SqList & );  
Status ListInsert( SqList &, int, ElemType );   //这是需要你编写的基本操作   
Status GetElem( SqList, int, ElemType & );  //这是需要你编写的基本操作   
int    ListLength( SqList );        //这是需要你编写的基本操作  
Status ListTraverse( SqList &, void (*)( ElemType ) );  
void   ListUnion( SqList &, SqList );  
void   out( ElemType );  
int    equal(ElemType, ElemType );   
Status LocateElem(SqList, ElemType, Status (*)(ElemType,ElemType));  
  
// 以下为函数定义  
Status InitList( SqList & L )   // 建立一个空的线性表 L  
{  
    L.elem = (ElemType *)malloc(LIST_MAX_SIZE*sizeof(ElemType));  
//  if ( !L.elem )  exit(-1);   // 失败则终止程序   
    L.length    = 0;            // 空表长度为0  
    L.listsize  = LIST_MAX_SIZE;  
    return OK;  
}  
  
Status ListTraverse( SqList &L, void (*visit)( ElemType ) )  
{   // 依次对L的每个元素调用函数visit()。若visit()失败,则操作失败  
    int i, L_len = ListLength( L );  
    ElemType e;  
      
    for ( i = 1;  i <= L_len; i++ )  {  
        GetElem(L, i, e);  
        (*visit)( e );  
    }  
    return OK;  
}  
  
int equal(ElemType x, ElemType y)  
{   return x==y;  
}  
  
Status LocateElem( SqList L, ElemType e,  
                   Status (*compare)(ElemType,ElemType) )  
{   //在L中查找与元素 e 满足compare() 的第 1 个元素  
    //返回 L 中第 1 个与 e 满足关系compare( ) 的元素的位序  
    int i = 1;  
    ElemType * p;  
    while ( i<=L.length )  //  
        if  ( (*compare)(e,L.elem[i-1]) ) break;  
        else  i++;  
    if ( i <= L.length )  return i;  // 找到 e,返回位序i  
    else return 0;      //若没有找到,则返回0  
}  
  
void out( ElemType e )  
{   printf("%d,", e);  
}  
  
void ListUnion( SqList &La,  SqList Lb ) //求 A=A∪B  
{   int La_len, Lb_len, i;  
    ElemType e;  
   
    La_len = ListLength( La );       // 求线性表的长度  
    Lb_len = ListLength( Lb );  
    for ( i = 1;  i <= Lb_len;  i++ )  {  
        GetElem(Lb, i, e);  // 取Lb中第i个数据元素赋给e  
        if ( !LocateElem( La, e, equal ) )   
            ListInsert ( La, ++La_len, e ); // La中不存在和 e 相同的数据元素,则插入  
    }  
}  
  
int main()  
{   SqList La, Lb;  
    int n, i;  
    ElemType e;  
      
    InitList( La );  
    InitList( Lb );  
    scanf("%d", &n);        //读入集合A   
    for ( i=0; i

提交代码

// 在顺序线性表 L 中第 i (1≤i≤L.length+1)个位置之前插入元素 e
Status ListInsert(SqList& L, int i, ElemType e)
{
    if (i < 1 || i > L.length + 1) {
        return ERROR;  // 插入位置不合法
    }
    if (L.length == L.listsize) {  // 线性表已满,需要扩容
        ElemType* newElem = (ElemType*)realloc(L.elem, (L.listsize + LIST_MAX_SIZE) * sizeof(ElemType));
        if (!newElem) {
            return ERROR;  // 内存分配失败
        }
        L.elem = newElem;
        L.listsize += LIST_MAX_SIZE;
    }
    for (int j = L.length; j >= i; j--) {
        L.elem[j] = L.elem[j - 1];  // 将第 i 个位置及其后面的元素后移一位
    }
    L.elem[i - 1] = e;  // 插入元素到第 i 个位置
    L.length++;  // 线性表长度加一
    return OK;
}

// 在线性表 L 中获取第 i 个元素的值并存储到 e 中
Status GetElem(SqList L, int i, ElemType& e)
{
    if (i < 1 || i > L.length) {
        return ERROR;  // 查找位置不合法
    }
    e = L.elem[i - 1];  // 获取第 i 个元素的值
    return OK;
}

// 返回线性表 L 的长度
int ListLength(SqList L)
{
    return L.length;  // 返回线性表的长度
}

你可能感兴趣的:(数据结构与算法设计,算法,c++)