0
点赞
收藏
分享

微信扫一扫

线性表的顺序存储结构

晗韩不普通 2022-04-16 阅读 109

仅以此博客记录学习经历

 

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ERROR 0
#define OK 1
#define OVERFLOW -1

class Sqlist{
public:
	int* elem;
	int length;
	int listsize;
};

int init_Sqlist(Sqlist& L);
int insert_Sqlist(Sqlist& L, int i, int e);
int locate(Sqlist L, int e);
void unionmerge(Sqlist& la, Sqlist lb);
int ListDelete_Sq(Sqlist& L, int i, int& e);


int main() {

	int i = -1, m = -1, n = -1, e = -1;
	Sqlist la = { 0 }, lb = { 0 };
	cout << "请输入第一个集合la中的元素个数:";
	cin >> m;
	cout << "请输入第二个集合lb中的元素个数:";
	cin >> n;
	init_Sqlist(la);
	cout << "请输入第一个集合la中的各个元素:";
	for (int i = 1; i <= m; ++i) {
		cin >> e;
		insert_Sqlist(la, i, e);
	}

	printf("第一个集合la中的 %d 个元素依次是:", la.length);
	for (int i = 0; i < la.length; i++) {
		printf("%d  ", *(la.elem + i));
	}
	cout << endl;

	init_Sqlist(lb);
	cout << "请输入第二个集合lb中的各个元素:";
	for (int i = 1; i <= n; i++) {
		cin >> e;
		insert_Sqlist(lb, i, e);
	}
	printf(" 第二个集合lb中的 %d 个元素依次是:",lb.length);
	for (int i = 0; i < lb.length; i++) {
		printf("%d  ", *(lb.elem + i));
	}
	cout << endl;

	unionmerge(la, lb);
	cout << endl;
	printf("合并后集合la中的 %d 个元素依次是:",la.length);
	for (int i = 0; i < la.length; i++) {
		printf("%d  ", *(la.elem + i));
	}
	cout << endl;

	cout << "请输入要删除第几个元素:";
	cin >> i;

	if (ListDelete_Sq(la, i, e)) {
		printf("被删除的元素是:%d \n", e);
	}
	printf("删除后集合la中的 %d 个元素依次是:", la.length);
	for (int i = 0; i < la.length; i++) {
		printf("%d  ", *(la.elem + i));
	}
	cout << endl;
	return 0; 
}

int init_Sqlist(Sqlist& L) {
	L.elem = new int[LIST_INIT_SIZE];
	if (!L.elem) { exit(OVERFLOW); }
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}


int insert_Sqlist(Sqlist& L, int i, int e) {
	int* newbase = NULL;
	int* p = nullptr;
	int* q = NULL;
	if (i < 1 || i > L.length + 1) { return ERROR; }
	if (L.length >= L.listsize) {
		newbase = (int* )realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(int));
		if (!newbase) { return OVERFLOW; }
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	q = L.elem + i - 1;
	for (p = L.elem + L.length - 1; p >= q; --p ) {
		*(p + 1) = *p;
	}
	*q = e;
	++L.length;
	return OK; 
}

int locate(Sqlist L, int e) {
	int i = -1;
	int* p = NULL;
	p = L.elem;
	while (i <= L.length && e != *p) {
		++i;
		++p;
	}
	if (i <= L.length){ return i; }
	else { return 0; }
}

void unionmerge(Sqlist& la, Sqlist lb) {
	int i = -1;
	int e = -1;
	for (int i = 0; i < lb.length; i++) {
		e = *(lb.elem + i);
		if (!locate(la, e)) {
			insert_Sqlist(la, la.length + 1, e);
		}
	}
}

int ListDelete_Sq(Sqlist& L, int i, int& e) {
	 //在顺序表L中删除第i个元素,并用e返回其值
	//i的合法值为 1 <= i <= ListLength_Sq(L)
	int* p = NULL;
	int* q = NULL;
	if (i < 1 || i > L.length) { return ERROR; }
	p = &(L.elem[i - 1]);
	e = *p;
	q = L.elem + L.length - 1;
	for(++p; p <= q; ++p) {
		*(p - 1) = *p;
	}
	--L.length;
	return OK;
}


举报

相关推荐

0 条评论