算法2.1 实现一个新的集合 A = A ∪ B

这里写图片描述
题目: 假设利用两个线性表 LA 和 LB,分别表示两个集合A 和 B,现要求新的集合A = A ∪ B


核心代码段:

void ListUnion (SeqList * LA, SeqList * LB)
{
    int La_len = 0;
    int Lb_len = 0;
    int i = 0;
    ElemType val = 0;

    La_len = ListLength (LA);
    Lb_len = ListLength (LB);

    for (i = 1; i <= Lb_len; i++)
    {
        // 获取LB链表中的每一个值
        val = GetElem (LB, i);
        // 判断这个值是否存在于LA中,若不存在,添加进去
        if (LocateElem (LA, val, Compare) == 0)
        {
            ListInsert (LA, ++La_len, val);
        }
    }
}

.h文件

# ifndef SEQLIST_H_
# define SEQLIST_H_

#include <stdio.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 2

typedef int ElemType;

// 定义结构体

typedef struct SeqList_tag
{
    ElemType * elem;        //链表的起始地址
    int length;             //链表的长度
    int size;               //链表现有的长度   
}SeqList;

// 1 初始化一个线性表
int InitList (SeqList * L);

// 2 销毁线性表
int Destory (SeqList * L); 

// 3 清空线性表
int Clear (SeqList * L); 

// 4 判断链表是否为空
int ListEmpty (SeqList * L); 

// 5 返回链表的长度
int ListLength (SeqList * L);

// 6 在L中的第i个位置前插入新的元素e
int ListInsert (SeqList * L, int pos, int val); 

// 7 获取L中的第i个位置的元素 
ElemType GetElem (SeqList * L, int pos);

ElemType ListDelete (SeqList * L, int pos);

int LocateElem (SeqList * L, ElemType val, int (Compare)(ElemType, ElemType));

int Compare(ElemType, ElemType);

void ListUnion (SeqList * LA, SeqList * LB); 
#endif

.c文件

# include "SeqList.h"
#include <malloc.h>

/*
typedef struct SeqList_tag
{
    ElemType * elem;        //链表的起始地址
    int length;             //链表的长度
    int size;               //链表现有的长度   
}SeqList;
*/

// 1 初始化一个线性表
int InitList (SeqList * L)
{
    // 1.1 分配一块内存
    L->elem = (SeqList *) malloc (LIST_INIT_SIZE * sizeof (ElemType));
    if (L->elem == NULL)
    {
        return -1;
    } 

    L->length = 0;
    L->size   = LIST_INIT_SIZE;

    return 0;
}

int Destory (SeqList * L)
{
    if (L->elem != NULL)
    {
        free (L->elem);
        L->elem   = NULL;
        L->length = 0;
        L->size   = 0;
        return 0;
    }
    return -1;
}

int Clear (SeqList * L)
{
    L->length = 0;
    return L->length;
}

// 4 判断链表是否为空
int ListEmpty (SeqList * L)
{
    if (L->length != 0)
        return 0;
    else
        return -1;
}

// 5 返回链表的长度
int ListLength (SeqList * L)
{
    return L->length;
}

// 6 在L中的第i个位置前插入新的元素e
int ListInsert (SeqList * L, int pos, int val)
{
    ElemType * newbase;
    ElemType * p; 
    ElemType * q;
    // 6.1 首先判断链表L是否为空且插入的位置是否正确
    if ((pos < 1) || (pos > L->length + 1))
    {
        return -1;  
    }   
    if (L->length >= L->size)
    {
        newbase = (ElemType *) realloc (L->elem, (LISTINCREMENT + L->size) * sizeof (ElemType));
        if (newbase == NULL)
        {
            return -1;
        }
        L->elem = newbase;
        L->size += LISTINCREMENT;
    }
    // 6.3  插入元素
    // 6.3.1 首先找到带插入元素的位置 ,直接进行指针插入运算 
    q = L->elem + pos - 1;
    // 6.3.2pos位置的元素都向后移动一位
    for (p = L->elem + L->length - 1; p >= q; --p)
    {
        *(p - 1) = * p; 
    } 
    *q = val;
    L->length += 1; 
    return 0;
}

// 删除L中的元素
ElemType ListDelete (SeqList * L, int pos)
{
    ElemType * p;
    ElemType * q;
    int val;
    if (pos < 1 || pos > L->length)
    {
        return 10086;
    }

    p = L->elem + pos - 1;
    val = *p;
    q = L->elem + L->length - 1;

    for (; p <= q; p ++)
    {
        *(p - 1) = * p; 
    }

    L->length -= 1;
    return val;
} 
// 返回L中的第i个元素
ElemType GetElem (SeqList * L, int pos)
{
    if (pos < 1 || pos > L->length)
    {
        return -1;
    }
    return * (L->elem + pos - 1);
}

//
int LocateElem (SeqList * L, ElemType val, int (Compare)(ElemType, ElemType))
{
    int i = 1;

    while (i <= L->length && !Compare (val, * (L->elem + i - 1)))
    {
        i ++;   
    }   

    if (i <= L->length)
    {
        return i;
    }
    else
        return 0;
} 

int Compare(ElemType a, ElemType b)
{
    if (a == b)
        return 1;
    else
        return 0;
}

void ListUnion (SeqList * LA, SeqList * LB)
{
    int La_len = 0;
    int Lb_len = 0;
    int i = 0;
    ElemType val = 0;

    La_len = ListLength (LA);
    Lb_len = ListLength (LB);

    for (i = 1; i <= Lb_len; i++)
    {
        val = GetElem (LB, i);

        if (LocateElem (LA, val, Compare) == 0)
        {
            ListInsert (LA, ++La_len, val);
        }
    }
}

测试程序

#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    // 因为list没有地址,只是声明了,所以此处不能声明指针变量 
    SeqList LA;
    SeqList LB;

    int i = 0; 

    // 1. 初始化
    InitList (&LA);
    InitList (&LB);

    // 2. 赋值元素
    for (i = 1; i <= 5; i++)
        ListInsert (&LA, i, i * 2);
    printf ("LA :");
    for (i = 1; i <= 5; i++)
        printf ("%d ", GetElem(&LA, i)) ;
    printf ("\n");

    for (i = 1; i <= 5; i++)
        ListInsert (&LB, i, i);
    printf ("LB :");
    for (i = 1; i <= 5; i++)
        printf ("%d ", GetElem(&LB, i)) ;
    printf ("\n");


    ListUnion (&LA, &LB);

    printf ("The List A :");
    for (i = 1; i <= ListLength (&LA); i++)
        printf ("%d ", GetElem(&LA, i)) ;
    printf ("\n");

    return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值