01、顺序表SeqList

SeqList.h

#pragma once
#define ListSize 100
typedef int DataType;
typedef struct {
	DataType list[ListSize];
	int length;
}SeqList;

void InitList(SeqList* L);/*初始化线性表*/
int ListEmpty(SeqList L);/*判断线性表是否为空,为空返回1,否则返回0*/
int GetElem(SeqList L, int i, DataType* e);/*查找线性表的第i个元素,查找成功将该值返回给e,并返回1表示成功,
否则返回-1表示失败*/
int LocateElem(SeqList L, DataType e);/*查找线性表中元素为e的元素是第多少个元素*/
int InsertList(SeqList* L, int i, DataType e);/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入的位置不合法,返回-1,顺序表满返回0*/
int DeleteList(SeqList* L, int i, DataType* e);
int ListLength(SeqList L);
void ClearList(SeqList* L);
void MergeList(SeqList A, SeqList B, SeqList* C);
void UnionAB(SeqList* A, SeqList B);/*将B中不在A中的元素插入到A*/
void DelElem(SeqList* A, SeqList B);/*元素在A,B中都存在,在顺序表A中删除该元素*/
void PrintList(SeqList L); 

SeqList.cpp

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

void InitList(SeqList* L)
/*初始化线性表*/
{
	L->length = 0; /*把线性表的长度置为0*/
}


int ListEmpty(SeqList L)
/*判断线性表是否为空,为空返回1,否则返回0*/
{
	if (L.length == 0) {
		return 1;
	}
	else {
		return 0;
	}
}

int GetElem(SeqList L, int i, DataType* e)
/*查找线性表的第i个元素,查找成功将该值返回给e,并返回1表示成功,
否则返回-1表示失败*/
{
	if (i<1 || i>L.length) {
		return -1;
	}
	*e = L.list[i - 1];
	return 1;
}


int LocateElem(SeqList L, DataType e)
/*查找线性表中元素为e的元素是第多少个元素*/
{
	int i;
	for (i = 0; i < L.length; i++) {
		if (L.list[i] == e) {
			return i + 1;
		}
	}
	return 0;
}

int InsertList(SeqList* L, int i, DataType e)
/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入的位置不合法,返回-1,顺序表满返回0*/
{
	int j;
	if (i<1 || i>L->length + 1)/*在插入前,判断插入位置是否合法*/
	{
		printf("插入的位置i不合法!\n");
		return -1;
	}
	else if (L->length >= ListSize)/*插入之前,判断是否已经满,不能插入元素*/
	{
		printf("顺序表已满,不能插入元素。\n");
		return 0;
	}
	else {
		for (j = L->length; j >= i; j--)/*将第i个位置后的元素一次后移*/
		{
			L->list[j] = L->list[j - 1];
		}
		L->list[i - 1] = e;/*插入元素到第i个位置*/
		L->length++;
		return 1;
	}
}

int DeleteList(SeqList* L, int i, DataType* e) {
	int j;
	if (L->length <= 0) {
		printf("顺序表已经不能够进行删除!\n");
		return 0;
	}
	else if (i<1 || i>L->length + 1) {
		printf("删除的位置不合法!\n");
		return -1;
	}
	else {
		*e = L->list[i - 1];/*获取第i个位置的元素*/
		for (j = i; j <= L->length - 1; j++) {
			L->list[j - 1] = L->list[j];
		}
		L->length = L->length - 1;
		return 1;
	}
}

int ListLength(SeqList L)
{
	return L.length;
}

void ClearList(SeqList* L)
{
	L->length = 0;
}

void MergeList(SeqList A, SeqList B, SeqList* C) {
	int i, j, k;
	DataType e1, e2;//用于存储A和B顺序表中的元素
	i = 1, j = 1, k = 1;
	while (i <= A.length && j <= B.length) {
		GetElem(A, i, &e1);
		GetElem(B, j, &e2);
		if (e1 <= e2) {
			InsertList(C, k, e1);/*将较小的元素插入C中*/
			i++;/*往后移动一个元素*/
			k++;/*C顺序表中待插入位置+1*/
		}
		else {
			InsertList(C, k, e2);
			j++;
			k++;
		}
	}
	while (i <= A.length)/*这时如果A还有剩余,B中已经没有元素*/ {
		GetElem(A, i, &e1);
		InsertList(C, k, e1);/*将A中剩余元素插入到C中*/
		i++;
		k++;
	}
	while (j <= B.length)/*这时B中还有剩余元素,A中已经没有元素*/ {
		GetElem(B, j, &e2);
		InsertList(C, k, e2);
		j++;
		k++;
	}
	C->length = A.length + B.length;
}


void UnionAB(SeqList* A, SeqList B) {
	DataType e;
	for (int i = 1; i <= B.length; i++)
	{
		GetElem(B, i, &e);
		if (LocateElem(*A, e) == 0) {
			InsertList(A, A->length + 1, e);/*在A的末尾加入元素*/
		}
	}
}
void DelElem(SeqList* A, SeqList B) {
	DataType e;
	for (int i = 1; i <= B.length; i++)
	{
		GetElem(B, i, &e);
		int pos = LocateElem(*A, e);
		if (pos != 0) {
			DeleteList(A, pos, &e);/*A中存在e,则将其删除*/
		}
	}
}
void PrintList(SeqList L) {
	DataType elem;
	for (int i = 1; i <= L.length; i++)
	{
		if (GetElem(L, i, &elem)) {
			printf("%4d", elem);
		}
	}
	printf("\n");
}

 Test.cpp

void TestSeqList_Merge() {
    int i;
    DataType a[] = { 8,17,17,25,29 };
    DataType b[] = { 3,9,21,21,26,27 };
    SeqList A, B, C;/*声明顺序表A,B,C*/
    InitList(&A);/*初始化顺序表A, B, C*/
    InitList(&B);
    InitList(&C);
    for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
        /*将数组a中的元素插入顺序表A*/
        InsertList(&A, i, a[i - 1]);      
    }
    for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
        /*将数组b中的元素插入顺序表B*/
        InsertList(&B, i, b[i - 1]);
    }
    printf("顺序表中A的元素:\n");
    PrintList(A);
    printf("顺序表中B的元素:\n");
    PrintList(B);

    printf("合并A,B中的元素得到C:\n");
    MergeList(A, B, &C);
    PrintList(C);


}

 

 

void TestSeqList_Union() {
    int i;
    DataType a[] = { 8,17,25,29 };
    DataType b[] = { 3,8,9,21,26,27 };
    SeqList A, B, C;/*声明顺序表A,B,C*/
    InitList(&A);/*初始化顺序表A, B, C*/
    InitList(&B);
    InitList(&C);
    for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
        /*将数组a中的元素插入顺序表A*/
        InsertList(&A, i, a[i - 1]);
    }
    for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
        /*将数组b中的元素插入顺序表B*/
        InsertList(&B, i, b[i - 1]);
    }
    printf("顺序表中A的元素:\n");
    PrintList(A);
    printf("顺序表中B的元素:\n");
    PrintList(B);

    printf("合并A,B中的元素得到新的A:\n");
    UnionAB(&A, B);
    PrintList(A);


}

 

void TestSeqList_Dele() {
    int i;
    DataType a[] = { 8,17,21,25,27,29 };
    DataType b[] = { 3,8,9,21,26,27 };
    SeqList A, B, C;/*声明顺序表A,B,C*/
    InitList(&A);/*初始化顺序表A, B, C*/
    InitList(&B);
    InitList(&C);
    for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
        /*将数组a中的元素插入顺序表A*/
        InsertList(&A, i, a[i - 1]);
    }
    for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
        /*将数组b中的元素插入顺序表B*/
        InsertList(&B, i, b[i - 1]);
    }
    printf("顺序表中A的元素:\n");
    PrintList(A);
    printf("顺序表中B的元素:\n");
    PrintList(B);

    printf("删除A在B中的元素得到新的A:\n");
    DelElem(&A, B);
    PrintList(A);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值