顺序表及其基本操作验证程序设计

本文详细介绍了一个基于顺序表的程序设计,包括初始化、插入、删除、查找、遍历、排序、合并和归并等功能的实现。通过具体代码示例,展示了如何进行数据结构的基本操作,并提供了一个交互式的菜单系统,让用户可以直观地理解并实践顺序表的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序表及其基本操作验证程序设计

完成顺序表的建立、插入、删除、查找、遍历、排序、合并、归并等算法功能及实现。

#include<iostream>
#include<malloc.h>   //malloc()等
#include<stdio.h>
#include<process.h>
using namespace std;

#define TRUE 1  //函数结果状态
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 20  //表的空间初始分配量
#define LISTINCREMENT 2    //储存空间分配增量
typedef  int Status;         /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;      //

typedef struct SqList   //顺序表结构
{
	ElemType *elem;  //首地址
	int length;
	int listsize;
};

Status InitList(SqList *L)   //构造空表
{
	(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!(*L).elem) exit(OVERFLOW);
	(*L).listsize = LIST_INIT_SIZE;
	(*L).length = 0;
	return OK;
}

Status GetElem(SqList L, int i, ElemType *e)   //获取表中第i个元素的值并用e返回
{
	if (i<1 || i>L.length) exit(ERROR);
	*e = *(L.elem + i - 1);
	return OK;
}

//返回表中第一个与e相等的元素位序
int LocateElem(SqList L, ElemType e)
{
	for (int i = 1; i <= L.length; i++) if (*(L.elem + i - 1) == e) return i;
	return 0;
}

Status ListInsert(SqList *L, int i, ElemType e) //第i个位置前插入e,表长+1
{
	ElemType *newbase, *p;
	if (i<1 || i>(*L).length + 1) return ERROR;
	if ((*L).length >= (*L).listsize)
	{
		newbase = (ElemType*)realloc((*L).elem, ((*L).length + LISTINCREMENT) * sizeof(ElemType));
		if (!newbase)  exit(OVERFLOW);
		(*L).elem = newbase;
		(*L).listsize += LISTINCREMENT;
	}
	for (p = (*L).elem + (*L).length; p>(*L).elem + i - 1; p--) *p = *(p - 1);
	*p = e;
	(*L).length++;
	return OK;
}
Status ListDelete(SqList *L, int i) //删除第i个位置数据,表长-11
{
	ElemType *p;
	if (i<i || i>(*L).length + 1) return ERROR;
	for (p = (*L).elem + i - 1; p <= (*L).elem + (*L).length - 1; p++) *p = *(p + 1);
	(*L).length--;
	return OK;
}

void Union(SqList *La, SqList Lb)
{
	ElemType e;
	for (int i = 1; i <= Lb.length; i++)
	{
		GetElem(Lb, i, &e);
		if (!LocateElem(*La, e)) ListInsert(La, (*La).length, e);
	}
}

void ListTraverse(SqList L) //表遍历
{
	for (int i = 1; i <= L.length; i++)
		cout << *(L.elem + i - 1) << "  ";
}

void MergeList(SqList La, SqList Lb, SqList *Lc)
{
	ElemType ai, bj;
	int i = 1, j = 1, k = 1;
	InitList(Lc);
	while (i <= La.length&&j <= Lb.length)
	{
		GetElem(La, i, &ai); GetElem(Lb, j, &bj);
		if (ai <= bj) { ListInsert(Lc, k++, ai); i++; }
		else { ListInsert(Lc, k++, bj); j++; }
	}
	while (i <= La.length) { GetElem(La, i, &ai); ListInsert(Lc, k++, ai); i++; }
	while (j <= Lb.length) { GetElem(Lb, j, &bj); ListInsert(Lc, k++, bj); j++; }

}
void sort(SqList &L)
{
	int i, j, t, min;
	for (i = 0; i<L.length - 1; i++)
	{
		t = i;
		for (j = i + 1; j<L.length; j++)
		{
			if (*(L.elem + j)<*(L.elem + t))  t = j;
		}
		if (t != i) { min = *(L.elem + i); *(L.elem + i) = *(L.elem + t); *(L.elem + t) = min; }
	}
}
int num(char str[])
{
	int n = 0, i, l;
	l = strlen(str);
	for (i = 0; i<l; i++) n += int(str[i] - 48)*int(pow(10., l - i - 1));
	return n;
}
int input(int &n)
{
	char str[100];
	cin >> str;
	for (int i = 0; i<strlen(str); i++) if (str[i]>'9' || str[i]<'0') { return 0; break; }
	n = num(str);
	return 1;

}
int input(char &s)
{
	char str[100];
	cin >> str;
	if (strlen(str) != 1) return 0;
	else if (str[0] != 'a'&&str[0] != 'B'&&str[0] != 'A'&&str[0] != 'b') return 0;
	else { s = str[0]; return 1; }
}



int main()
{
	SqList La, Lb, Lc;
	InitList(&La); InitList(&Lb);
	int i, n, l, e; char s;
	cout << "//建立线性表La..." << '\n' << "请输入La的长度:";
	while (1) { if (input(La.length) && La.length > 0) break; cout << "输入错误!!!" << '\n' << "请重新输入:"; }
	cout << "请输入" << La.length << "个数据给La:";
	for (i = 1; i <= La.length; i++) cin >> *(La.elem + i - 1);
	cout << endl;
	cout << "//建立线性表Lb..." << '\n' << "请输入Lb的长度:";
	while(1) {if (input(Lb.length)&&Lb.length>0) break; cout << "输入错误!!!" << '\n' << "请重新输入:"; }
	cout << "请输入" << Lb.length << "个数据给Lb:";
	for (i = 1; i <= Lb.length; i++) cin >> *(Lb.elem + i - 1);
	cout << '\n' << "顺序表La的数据是:"; ListTraverse(La);
	cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb);

	do {
		cout << '\n' << "///////////////////////////////////////////////////////////////////////////////////////////////////////////////////" << '\n' << endl;
		cout << "顺序表操作:" << '\n' << " 1.插入数据" << '\t' << '\t' << "2.删除数据" << '\t' << '\t' << "3.查找数据" << '\t' << '\t' << "4.输出顺序表" << '\n' << " 5.非递减排序"
			<< '\t' << '\t' << "6.将Lb表合并到La表中" << '\t' << '\t' << "7.将La和Lb归并到新表Lc中" << '\t' << '\t' << "0.退出" << '\n' << '\n' << "请输入操作序号:";

		while (1)
		{
			if (input(n) && n >= 0 && n <= 7) break;
			else  cout << "****输入错误****" << '\n' << '\n' << "请输入操作序号:";
		}
		switch (n)
		{
		case 1:
			cout << "选择操作对象(A:La B:Lb):";
			while (1)
			{
				if (!input(s))
					cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
				else break;
			}
			switch (s)
			{
			case 'A':
			case 'a':
			{
				cout << "请输入插入位置:";
				while (1)
				{
					if (!input(l) || l<1 || l>La.length + 1) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
					else break;
				}
				cout << "输入数据:";
				while (1) { if (input(e)) break; else cout << "****输入错误****" << '\n' << '\n' << "请重新输入数据:"; }
				ListInsert(&La, l, e);
				cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl;
			} break;
			case 'B':
			case'b':
			{
				cout << "请输入插入位置:";
				while (1)
				{
					if (!input(l) || l<1 || l>Lb.length + 1) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
					else break;
				}
				cout << "输入数据:";
				while (1) { if (input(e)) break; else cout << "****输入错误****" << '\n' << '\n' << "请重新输入数据:"; }
				ListInsert(&Lb, l, e);
				cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl;
			} break;
			}
			break;
		case 2:
			cout << "选择操作对象(A:La B:Lb): ";
			while (1)
			{
				if (!input(s))
					cout << "输入错误!!!" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
				else break;
			}
			switch (s)
			{
			case 'A':
			case 'a':
			{
				cout << "请输入删除位置:";
				while (1)
				{
					if (!input(l) || l<1 || l>La.length) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
					else { ListDelete(&La, l); break; }
				}
				cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl;
			} break;
			case 'B':
			case'b':
			{
				cout << "请输入删除位置:";
				while (1)
				{
					if (!input(l) || l<1 || l>Lb.length) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
					else { ListDelete(&Lb, l); break; }
				}
				cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl;
			} break;
			}break;
		case 3:
		{
			cout << "输入查找数据: "; int data;
			while (1)
			{
				if (!input(data)) cout << "****输入错误****" << '\n' << '\n' << "输入查找数据:";
				else { cout << '\n'; break; }
			}
			if (LocateElem(La, data)>0)
			{
				cout << "顺序表La中";
				for (i = 1; i <= La.length; i++)  if (data == *(La.elem + i - 1))  cout << "(" << i << ")";
				cout << "位置存在数据" << data << endl;
				if (LocateElem(Lb, data)>0)
				{
					cout << "顺序表Lb中";
					for (i = 1; i <= Lb.length; i++)  if (data == *(Lb.elem + i - 1))  cout << "(" << i << ")";
					cout << "位置存在数据" << data << endl;
				}
			}
			else cout << "不存在此数据...." << endl;
		}break;
		case 4:
		{
			cout << "选择操作对象(A:La B:Lb): ";
			while (1)
			{
				if (!input(s))
					cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
				else break;
			}
			switch (s)
			{
			case 'A':
			case 'a': {cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; } break;
			case 'B':
			case 'b': {cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl; } break;
			}
		}
		case 5:
			cout << "选择操作对象(A:La B:Lb): ";
			while (1)
			{
				if (!input(s))
					cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
				else break;
			}
			switch (s)
			{
			case 'A':
			case 'a': {sort(La); cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; } break;
			case 'B':
			case 'b': {sort(Lb); cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl; } break;
			}break;
		case 6: {Union(&La, Lb); cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; }break;
		case 7: {MergeList(La, Lb, &Lc); cout << '\n' << "顺序表Lc的数据是:"; ListTraverse(Lc); cout << endl; }break;
		}
	} while (n>0);
}

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值