顺序表的定义和操作

#include<iostream>
using namespace std;

#define MaxSize 10
typedef int ElemType;
typedef struct {
	ElemType* elem;
	int length;
}SqList;

//初始化
bool initList(SqList &L) {
	L.elem = new int[MaxSize];
	if (!L.elem) return false;
	L.length = 0;
	return true;
}
//输入数据
void Input(SqList& L,int n) {
	if (n > MaxSize) {
		cout << "太多了,放不下" << endl;
		return;
	}
	cout << "请输入数据:";
	for (int i = 0; i < n; i++){
		cin >> L.elem[i];
	}
	L.length = n;
}
//输出
void Show(SqList L) {
	for (int i = 0; i < L.length; i++)
		cout << L.elem[i] << " ";
}
//取出位置的元素
int getElem(SqList L,int i){
	if (i > L.length || i <= 0) {
		cout << "没有哦";
		return -1; }
	return L.elem[i - 1];
}
//表长
int getLength(SqList L) {
	return L.length;
}
//插入
bool insertList(SqList& L, int i,ElemType e) {
	if (L.length >= MaxSize) {
		cout << "空间满了,放不下"<<endl;
		return false;
	}
	if (i <= 0 || i >L.length+1) { 
		cout << "插入的位置不对";
		return false;
	}
	for (int j = L.length - 1; j > i-2; j--)
		L.elem[j + 1] = L.elem[j];
	L.elem[i - 1] = e;
	L.length++;
	return true;
}
//删除
bool ListDelete(SqList& L, int i, ElemType& e) {
	//删除顺序表的第 i 个元素,用e返回被删元素的值
	if (i<1 || i>L.length) return false;  //i非法
	//ElemType* p = L.elem + i - 1;//令指针p指向ai,p=L.elem+i-1;
	//e = *p;
	//for (p++; p <= L.elem + L.length - 1; p++)
	//	*(p - 1) = *p;                  //ai+1…an左移一位  
	//L.length--;                   //表的长度减1
	//return true;
	e = L.elem[i - 1];
	for (int j = i; j < L.length; j++)
		L.elem[j - 1] = L.elem[j];
	L.length--;
	return true;
}    //ListDelete  
//判空
bool EmptyList(SqList L) {
	if (L.length == 0) return true;
	return false;
}
//合并
void  MergeList(SqList  La, SqList  Lb, SqList& Lc) {
	//将有序线性表La和Lb归并成有序线性表Lc
	int i, j; i = j = 1;  int k = 0;  initList(Lc); //初始化 
	int ai,bj;
	int La_len = getLength(La); int Lb_len = getLength(Lb);//求表长 
	while (i <= La_len && j <= Lb_len) { //La和Lb均非空 
		ai=getElem(La, i); bj=getElem(Lb, j );//读ai和bj 
		if (ai <= bj) { insertList(Lc, ++k, ai); i++; }
		else { insertList(Lc, ++k, bj); j++; }
	}
	while (i <= La_len) { //La中剩余元素一一插入Lc
		ai=getElem(La, i++); insertList(Lc, ++k, ai);
	}
	while (j <= Lb_len) { //Lb中剩余元素一一插入Lc
		bj=getElem(Lb, j++); insertList(Lc, ++k, bj);
	}
}// MergeList

//查找元素
int LocateElem(SqList& L, ElemType e) {
	//ElemType* p = L.elem; int i = 1;
	//while (i <= L.length && *p++ != e) i++;
	//return  i <= L.length ? i : 0;
	for (int i = 0; i < L.length; i++)
		if (L.elem[i] == e) return i;
	return -1;
}

//销毁线性表:
void DestroyList(SqList& L) {
	//释放顺序表L所占的空间
	delete[] L.elem;
	L.length = 0;
}

//逆置顺序表
void  Invert(ElemType* E,int  s, int  t) {
	//将数组E自下标s至下标t之间的元素逆置
	int temp;
	while (s < t) {
		temp = E[s];
		E[s]=E[t];
		E[t] = temp;
		s++; t--;
	}	
}


void InvertSqList(SqList& L) {
	//将顺序表L中的所有元素逆置
	Invert(L.elem, 0, L.length - 1);
}

//交换
void  Exchange(SqList L, int m) {
	//将顺序表L中前m个元素与后L,length-m个元素互换位置
	Invert(L.elem, 0, m - 1);
	Invert(L.elem, m, L.length - 1);
	Invert(L.elem, 0, L.length - 1);
}

//提纯
void purge(SqList& A, SqList& B) {
	//已知A为空顺序表,B可能为非纯顺序表
	//将顺序表B中所有不同值的元素插入A(纯表)中,然后销毁B
	A.elem[0] = B.elem[0]; A.length = 1;
	for (int i = 1; i < B.length; i++) {
		ElemType e = B.elem[i]; int j = 0;
		while (j < A.length && e != A.elem[j]) j++;
		if (j == A.length) A.elem[A.length++] = e;
	}//for
	delete[]B.elem;   B.length = 0;
}

int main() {
	SqList L; SqList La, Lb, Lc; SqList A;
	int data;
	do {
		cout << endl;
		cout << "\t 1 顺序表的初始化" << endl;
		cout << "\t 2 顺序表的输入" << endl;
		cout << "\t 3 顺序表的位置查找" << endl;
		cout << "\t 4 顺序表的显示" << endl;
		cout << "\t 5 顺序表的插入" << endl;

		cout << "\t 6 顺序表删除某个元素" << endl;
		cout << "\t 7 两个有序表的合并" << endl;
		cout << "\t 8 顺序表的按位置删除" << endl;
		cout << "\t 9 顺序表的逆置" << endl;
		cout << "\t 10 顺序表的前m个元素与后n个元素互换" << endl;
		cout << "\t 11 将顺序表B中所有不同值的元素插入A(纯表)中,然后销毁B" << endl;
		cout << "\t 0 退出操作" << endl;
		cin >> data;
		if (data == 1)
		{
			initList(L);
			//cout << L.elem << endl;
		}
		else if (data == 2)
			Input(L, 5);
		else if (data == 3)
			cout << "第3个位置的元素为:" << getElem(L, 3) << endl;
		else if (data == 4)
		{
			cout << "表中的元素为:";
			Show(L);
		}
		else if (data == 5)
			insertList(L,3,9);
		else if (data == 7) {
			initList(La);
			initList(Lb);
			initList(Lc);
			cout << "请输入由4个数字构成的有序数列:";
			Input(La,4);
			cout << "请输入由4个数字构成的有序数列:";
			Input(Lb,5);
			MergeList(La, Lb, Lc);
			Show(Lc);
		}
		else if (data == 8) {
			ElemType e;
			ListDelete(L, 2, e);
			cout << "删除的元素是" << e;
		}
		else if (data == 9) {
			InvertSqList(L);
			Show(L);
		}
		else if (data == 10) {
			Exchange(L, 2);
			
		}
		else if (data == 11) {
			initList(A);
			purge(A, L);
			cout << "A:"; Show(A);
			cout << "L:"; Show(L);
		}
	} while (data != 0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值