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

题目

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

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

输入:两个集合

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

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

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

预设代码

前置代码
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
 
#include <stdio.h>  
#include <stdlib.h>  
#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<n; i++ )  
    {   scanf("%d", &e);  
        ListInsert( La, i+1, e );  
    }  
    scanf("%d", &n);        //读入集合B   
    for ( i=0; i<n; i++ )  
    {   scanf("%d", &e);  
        ListInsert( Lb, i+1, e );  
    }  
    printf("Output La:");  
    ListTraverse( La, out );  
    printf("\nOutput Lb:");  
    ListTraverse( Lb, out );  
    ListUnion( La, Lb );  
    printf("\nResult La:");  
    ListTraverse( La, out );  
    printf("\n");  
    return OK;  
}  
  
/**************** 
Status ListInsert( SqList &L, int i, ElemType e ) 
{   //在顺序线性表L中第 i (1≤i≤L.length+1)个位置之前插入元素e, 
 
    Here is wating for you. 
 
} 
 
Status GetElem(SqList L, int i, ElemType &e) 
{ 
 
    Here is wating for you. 
 
} 
 
int ListLength(SqList L) 
{    
 
    Here is wating for you. 
 
} 
*********************/  
  
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 

提交代码

// 在顺序线性表 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;  // 返回线性表的长度
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆榆欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值