线性表代码

本文介绍了如何使用C++实现一个简单的顺序表数据结构,包括初始化、销毁、清空、判断空表、获取元素、定位元素、前驱后继操作、插入和删除元素,以及合并两个非递减有序线性表的功能。通过实例展示了顺序表的基本操作和维护技巧。
摘要由CSDN通过智能技术生成
// 数据结构实验2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include<iostream>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
	ElemType* elem;
	int       length;
	int       listsize;
}SqList;


Status InitList(SqList& L)
{
	L.elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem)exit(-1);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return true;
}

Status DestroyList(SqList& L)
{
	if (L.elem == NULL)
	{
		cout << "线性表不存在!" << '\n';
		return false;
	}

	free(L.elem);
	L.elem = NULL;
	return true;
}
Status ClearList(SqList& L)
{
	if (!L.elem)
	{
		cout << "线性表不存在!" << '\n';
		return false;
	}

	L.length = 0;
	return true;
}
int ListEmpty(SqList L)
{
	if (!L.elem)
	{
		cout<<"线性表不存在!"<<'\n';
		return -1;
	}

	if (L.length == 0)
		return true;
	else
		return false;
}
//5
int ListLength(SqList L)
{
	if (!L.elem)
	{
		cout << "线性表不存在!" << '\n';
		return -1;
	}
	return L.length;
}
//6

int GetElem(SqList& L, int i, int& e)
{
	if (i <= L.length)//利用指针直接保存第i个元素的值 
	{
		e = L.elem[i - 1];
		return true;
	}
	else
		return false;
}


//7
int LocateElem(SqList L, int e) //在线性表中找到元素e在登记号位置上 
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e) //遍历数组,若找到,返回具体位置 
		{
			return i + 1;
		}
	}
	return 0;//若未找到,返回0 
}

//8
int Prioelem(SqList& L, int cur_e, int& pre_e)
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == cur_e)
		{
			break;
		}
	}
	if (i == 0)
	{
		cout << "第一个元素无前驱" << '\n';
	}
	else if (i < L.length && i>=1)
	{
		pre_e = L.elem[i - 1];
		return true;
	}
	else
		cout<<"无该元素"<<'\n';
}
//9
int Nextelem(SqList& L, int cur_e, int& next_e)
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == cur_e)
		{
			break;
		}
	}
	if (i == L.length-1) 
	{
		cout << "最后一个元素无后继" << '\n';
	}
	else if (i < L.length - 1 && i >= 0)//则不需要考虑i小于零的情况 
	{
		next_e = L.elem[i + 1];
		return true;
	}
	else
		cout<<"无该元素"<<'\n';
}

//10
Status ListInsert(SqList& L, int i, ElemType e)
{
	ElemType* p, * q, * newelem;

	if (L.length >= L.listsize)
	{
		newelem = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!newelem)
			exit(-1);

		L.elem = newelem;
		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 true;
}
//11
int Listdelete(SqList& L, int i, int& e)//e为了保存删除的元素
{
	int* p, * q;
	p = &L.elem[i - 1];
	e = L.elem[i - 1];
	for (q = (&L.elem[L.length - 1]); q >= p; p++)
		*p = *(p + 1);
	L.length--;
	return true;
}
//12
Status ListTraverse(SqList L)
{
	ElemType* p;

	cout<<"该线性表中数据元素如下:";
	for (p = L.elem; p <= L.elem + L.length - 1; p++)
		cout<<*p<<'\n';
	return true;
}
//13
int Mergelist(SqList& L_a, SqList& L_b, SqList& L_c)
{
	int* pa = L_a.elem;
	int* pb = L_b.elem;
	L_c.listsize = L_a.length + L_b.length;
	L_c.length = L_c.listsize;
	int* pc = L_c.elem = (int*)malloc(L_c.listsize * sizeof(int));
	if (!L_c.elem)
	{
		printf("分配失败!");
		exit(OVERFLOW);
	}
	int* pa_last = L_a.elem + L_a.length - 1;
	int* pb_last = L_b.elem + L_b.length - 1;
	while (pa <= pa_last && pb <= pb_last)
	{
		if (*pa < *pb)
			*pc++ = *pa++;
		else
			*pc++ = *pb++;
	}
	while (pa <= pa_last) *pc++ = *pa++;
	while (pb <= pb_last) *pc++ = *pb++;
	return true;
}

int main()
{
		int flag = 0;
		SqList List,Lb,Lc;
		List.elem = NULL;

		while (1)
		{
			system("cls");//清屏

			cout << "1.初始化一个线性表"<<'\n';
			cout << "2.销毁线性表" << '\n';
			cout << "3.清空线性表" << '\n';
			cout << "4.判断线性表是否为空" << '\n';
			cout << "5.求线性表长度" << '\n';
			cout << "6.获取线性表中指定位置的元素" << '\n';
			cout << "7.获取线性表元素的位置" << '\n';
			cout << "8.求前驱" << '\n';
			cout << "9.求后继" << '\n';
			cout << "10.在线性表指定位置插入元素" << '\n';
			cout << "11.删除线性表指定位置元素" << '\n';
			cout << "12.显示线性表" << '\n';
			cout << "13.合并两个非递减有序的线性表" << '\n';
			cout << "输入-1退出程序。" << '\n';

			int select;
			cout<<"请输入你的选择:"<<'\n';
			cin >> select;
			switch (select)
			{
			case 1:
				flag = InitList(List);
				if (flag == 1)
					cout<<"初始化成功!"<<'\n';
				flag = 0;
				break;
			case 2:

					flag = DestroyList(List);
					if (flag == 1) 
					cout<<"顺序表销毁成功!"<<'\n';
					flag = 0;
				break;
			case 3:

					flag = ClearList(List);
					if (flag == 1)
					cout<<"顺序表清空成功!"<<'\n';
					flag = 0;
				break;

			case 4:
					flag=ListEmpty(List);
					if (flag == 1)
						cout << "该线性表为空表" << '\n';
					
					else if(flag==0) 
						cout << "该线性表不为空表" << '\n';
					flag = 0;
				break;

			case 5:
						cout<<"该顺序表的长度是;"<<ListLength(List)<<'\n';

					break;

			case 6:
				if (List.elem)
				{
					cout<<"请输入元素的指定位置:"<<'\n';
					int i;  int sen_x;
					cin >> i;
					flag = GetElem(List, i, sen_x);
					if (flag == 1)
						cout<<"元素的值是;"<< sen_x<<'\n';
					else
						cout<<"输入不合法!";
					flag = 0;
				}
				else 
					cout<<"顺序表不存在!"<<'/n';

				break;
			case 7:
				if (List.elem) {
					cout << "请输入要查找的元素:" << '\n';
					int i;  
					cin >> i;
					flag = LocateElem( List, i);
					if (flag == 0) {
						cout << "无该元素" << '\n';
					}
					else
						cout << "该元素的位置是:" <<flag<< '\n';
					flag = 0;
				}
				break;
			case 8://当前:current 之前的:previous 
				if (List.elem)
				{
					int cur_e; int pre_e1;
					cout<<"请输入该元素:"<<'\n';
					cin>>cur_e;
					flag = Prioelem(List, cur_e, pre_e1);
					if (flag == 1)
						cout<<"得到的前驱是:" <<pre_e1;
					flag = 0;
				}
				else 
					cout<<"顺序表不存在!"<<'\n';
				break;
			case 9:
				if (List.elem)
				{
					int cur_e;
					int next_e1;
					cout<<"请输入该元素:"<<'\n';
					cin>>cur_e;
					flag = Nextelem(List, cur_e, next_e1);
					if (flag == 1)
						cout<<"得到的后继是:"<<next_e1;
					flag = 0;
				}
				else 
					cout << "顺序表不存在!" << '\n';
				break;
			case 10:
				cout << "插入位置输入-1,结束插入循环" << '\n';
				while (true) {
					if (List.elem)
					{
						int ten_x;
						int i;
						cout << "请输入插入位置:" << '\n';
						cin >> i;
						if (i == -1)break;
						while (i<1 || i>List.length + 1)
						{
							cout << "输入不合法,请重新输入;" << '\n';
							cin >> i;
						}
						cout << "请输入要插入的元素:" << '\n';
						cin >> ten_x;
						flag = ListInsert(List, i, ten_x);
						if (flag == 1)
							cout<<"插入元素成功!"<<'\n';
						flag = 0;
					}
					else 
						cout << "顺序表不存在!" << '\n';
				}
				break;
			case 11:
				if (List.elem)
				{
					int i;
					int el_x;
					cout<<"请输入删除位置:"<<'\n';
					cin>>i;
					while (i<1 || i>List.length)
					{
						cout<<"输入不合法,请重新输入:"<<'\n';
						cin>>i;
					}
					flag = Listdelete(List, i, el_x);
					if (flag == 1)
						cout<<"删除元素成功!"<<'\n';
					flag = 0;
				}
				else 
					cout << "顺序表不存在!" << '\n';
				break;
			case 12:
				if (List.elem)
				    ListTraverse(List);
				else 
					cout << "顺序表不存在!" << '\n';
				break;
			case 13:
				if (List.elem)
				{
					cout<<"请初始化一个新顺序表Lb:"<<'\n';
					flag = InitList(Lb);
					if (flag == 1)
						cout<<"初始化成功!"<<'\n';
					flag = 0;
					//插入数据
					cout << "插入位置输入-1,结束插入循环" << '\n';
					while (true)
					{
						int ten_x = 0;
						int i = 0;
						cout << "请输入插入位置:" << '\n';
						cin >> i;
						if (i == -1)break;
						while (i<1 || i>Lb.length + 1)
						{
							cout << "输入不合法,请重新输入;" << '\n';
							cin >> i;
						}
						cout << "请输入要插入的元素:" << '\n';
						cin >> ten_x;
						flag = ListInsert(Lb, i, ten_x);
						if (flag == 1)
							printf("插入元素成功!");
						flag = 0;

						
					}
					//合并
					flag = Mergelist(List, Lb, Lc);
					if (flag == 1)
						cout<<"合并成功!"<<'\n';
					flag = 0;
					ListTraverse(Lc);
				}
				else 
					cout << "顺序表不存在!" << '\n';
				break;
			case -1:
				cout<<"程序结束!"<<'\n';
				exit(-1);
			default:
				cout<<"没有该选项,请重新选择:"<<'\n';
				break;
			}
			system("pause");//暂停作用
		}
		return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河哭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值