[C语言、C++]数据结构作业:集合合并

1、(5分)完成基于顺序表的合并函数:MergeSeqList(SeqList &LA, SeqList LB)

====main中测试:

1、建立LA,LB,元素分别为:1,2,3,4,5以及0,2,8,3,9

2、遍历LA,LB

3、合并LB到LA

4、打印LA

#include <iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
#define MAXSIZE 100
#define INITSIZE 100
#define OK 1
#define ERROR 0
typedef struct {
    ElemType* elem;         //存储空间的基地址
    int length;             //当前长度
    int listsize;
} SqList;                   //顺序表的结构类型为SqList
Status InitList(SqList& L) {//分配
    L.elem = new ElemType[INITSIZE];
    if (!L.elem) {
        cout << "存储分配失败!" << endl;
        exit(1);
        return ERROR;
    }
    L.length = 0; L.listsize = INITSIZE;
}
Status Listinsert(SqList& L, int i, ElemType e) {//插入函数
    if (i < 1 || i > L.length + 1) return ERROR;
    if (L.length >= L.listsize) return ERROR;//老师说ListExtend()可以先不写
    //移动元素,对i=L.length+1,无须移动
    for (int j = L.length - 1; j >= i - 1; j--)
        L.elem[j + 1] = L.elem[j];
    L.elem[i - 1] = e; //实际插在数组第i-1个位置
    L.length++;
    return OK;
}

Status printList(SqList L)//遍历打印
{
    if (L.length == 0)
    {
        printf("线性表为空\n");
        return 0;
    }
    int i;
    for (i = 0; i < L.length; i++)
    {
        printf("编号为%d,元素值:elem[%d]=%d\n", i + 1, i, L.elem[i]);
    }
    printf("\n");
    return OK;
}
Status GetElemSq(SqList L, int i, ElemType& e) {
    if (i < 1 || i > L.length) return ERROR;      //判断l. 值是否合理,若不合理, 返回 ERROR
    e = L.elem[i - 1];                         //elem[i-1] 单元存储第 i 个数据元素
    return OK;
}
Status LocateELem(SqList L, ElemType e) {
    //在顺序表中查找值为e的数据元素, 返回其序号
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] == e) {
            return i + 1;           //查找成功, 返回序号 i+l
        }
    }
    return ERROR;                       //查找失败, 返回 0           
}
void MergeSeqList(SqList& LA, SqList LB) {
    int m = LA.length;
    int n = LB.length;
    int e;
    for (int i = 1; i <= n; i++) {
        GetElemSq(LB, i, e);
        if (!LocateELem(LA, e)) {
            Listinsert(LA,++m, e);
        }
    }
}
int main(){
    SqList LA;
    SqList LB;
    InitList(LA);
    InitList(LB);
    int i = 0;
    for (i = 1; i <= 5; i++) {
        Listinsert(LA, i, i);//1、建立LA,LB,元素分别为:1,2,3,4,5
    }
    Listinsert(LB, 1, 0);//以及0,2,8,3,9
    Listinsert(LB, 2, 2);
    Listinsert(LB, 3, 8);
    Listinsert(LB, 4, 3);
    Listinsert(LB, 5, 9);
    printList(LA);//2、遍历LA,LB
    printList(LB);
    MergeSeqList(LA, LB);//3、合并LB到LA
    printList(LA);//4、打印LA
}

2、(5分)完成基于单链表的合并函数:MergeLinkList(LinkList &LA, LinkList LB)

1、(5分)完成基于顺序表的合并函数:MergeSeqList(SeqList &LA, SeqList LB)

====main中测试:

1、建立LA,LB,元素分别为:1,2,3,4,5以及0,2,8,3,9

2、遍历LA,LB

3、合并LB到LA

4、打印LA

#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	LinkNode* next;
}*LinkList;
void InitLinkList(LinkList& L) {
	LinkNode* s = new LinkNode;
	s->next = NULL;
	L = s;
}
void Traverse(const LinkList& L) {
	LinkNode* p = L->next;
	while (p) {
		cout << p->data << endl;
		p = p->next;
	}
}
void CreatHead(LinkList& L, int n) {
	L = new LinkNode; L->next = NULL;
	for (int i = 0; i < n; i++) {
		LinkNode* s = new LinkNode;
		cin >> s->data;
		s->next = L->next;
		L->next = s;
	}
}
void CreatRear(LinkList& L, int n) {
	L = new LinkNode;
	LinkNode* r = L;
	for (int i = 0; i < n; i++) {
		LinkNode* s = new LinkNode;
		cin >> s->data;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
int GetElem(const LinkList& L, int i, ElemType& e) {
	LinkNode* p = L->next; int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}//此时有2种可能:p空;j>=i
	if (!p || i < 1) return 0;//或if (!p || i < j)
	e = p->data;
	return 1;
}

int Insert(const LinkList& L, int i, ElemType e) {
	LinkNode* p = L; int j = 0;
	while (p && j < i - 1) {
		p = p->next; j++;
	}
	if (!p || i < 1) return 0; //i非法。
	LinkNode* s = new LinkNode;
	s->data = e;
	s->next = p->next; p->next = s;
	return 1;
}
int LocateElem(const LinkList& L, ElemType e) {
	LinkNode* p = L->next; int j = 1;
	while (p && p->data != e) {
		p = p->next;
		j++;
	}
	if (!p) return 0;
	return j;
}
void MergeLinkList(LinkList& LA, LinkList& LB) {//2、完成基于单链表的合并函数:MergeLinkList(LinkList &LA, LinkList LB)
	LinkNode* p = LB->next;
	while (p) {
		if (!LocateElem(LA, p->data)) {
			Insert(LA, 1, p->data);
		}
		p = p->next;
	}
}
int main() {
	LinkList LA;
	LinkList LB;
	InitLinkList(LA);//1、建立LA,LB,
	InitLinkList(LB);
	CreatRear(LA, 5);//元素分别为:1,2,3,4,5
	CreatRear(LB, 5);//以及0,9,8,7
	Traverse(LA);//2、遍历LA
	cout << "=======================================================" << endl;
	Traverse(LB);//2、遍历,LB
	cout << "=======================================================" << endl;
	MergeLinkList(LA, LB);//3、合并LB到LA
	Traverse(LA);//4、打印LA
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值