数据结构线性表 -顺序表练习Demo(稍作修改即为各种管理系统)

数据结构线性表 -顺序表练习Demo(稍作修改即为各种管理系统)

话不多说,直接上代码。

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

#define MAXSIZE 100  //顺序表大小,即为一共能存储的记录数(数据)

typedef struct{   //元素只有一个浮点型数据的结构体数组
	float p;
} Elem;

typedef struct{   //定义一个名称为Sqlist的顺序表,*elem 代表上面那个结构体数组首元素的地址
	Elem *elem;
	int length;
}Sqlist;

int InitList_Sq(Sqlist &L) //初始化顺序表
{
	float c = 0.0; int i;
	L.elem = new Elem[MAXSIZE];  //C++的定义结构体数组大小,C语言:L.elem = (Elem *)malloc(sizeof(Sqlist)*MAXSIZE);
	if (!L.elem)
		exit(-1);
	else
		L.length = 0;
	cout << "顺序表创建成功!请添加新建数据!按0结束!";  //结束条件可更改(更改需要改一下浮点型的数据类型)
	
	for (i = 0; i < MAXSIZE; i++)
	{
		if (L.elem[i-1].p == c)
		{
			break;
		}
		else
			cin >> L.elem[i].p;
	}
	L.length = i-1;
	return 1;
}

int DestoryList(Sqlist &L){  //销毁顺序表
	if (L.elem)
	{
		delete L.elem;
		L.length = 0;
		return 1;
	}
	else
		return 0;
}

void ClearList(Sqlist &L){  //将顺序表的长度置0
	L.length = 0;
}

int GetLength(Sqlist &L){  //获取顺序表的长度
	return L.length;
}

int IsEmpty(Sqlist &L){  //判断线性表是否为空
	if (L.length == 0)
	{
		return 1;
	}
	return 0;
}

int GetElem(Sqlist &L, int i, Elem e){  //查找第i个位置上的数据
	if (i<1 || i>L.length)
		return 0;
	else
		e = L.elem[i - 1];
	return 1;
}

void PrintList(Sqlist &L){   //输出顺序表数据
	if (L.length == 0)
	{
		cout << "此顺序表不存在或无数据元素!";
		exit(-2);
	}
	else
	{
		for (int i = 0; i < L.length; i++)
		{
			float e = L.elem[i].p;
			cout << e;
		}
	}
}

int InsertList(Sqlist &L, int k, float a)  //按指定位置插入数据
{
	if (k<1 || k>L.length)
		return 0;
	else if (L.length == 0)
		return 0;
	else 
	for (int i = L.length; i > k; i--)
	{
		L.elem[i].p = L.elem[i - 1].p;
		L.elem[k - 1].p = a;
	}
	L.length = L.length + 1;
	return 1;
}


int DeleteList(Sqlist &L, float k)  //删除顺序表指定位置上的数据
{
	if (k<1 || k>L.length-1)
		return 0;
	if (L.length == 0)
		return 0;
	for (int i = k; i < L.length; i++)
	{
		L.elem[i - 1].p = L.elem[i].p;
	}
	--L.length;
	return 1;
}

int SearchList(Sqlist &L, int k)  //查找书序表指定位置上的数据
{
	if (k<1 || k>L.length - 1)
		return 0;
	else if (L.length == 0)
		return 0;
	else return k - 1;
}

void AddList(Sqlist &L)   //在顺序表尾部添加数据
{
	float a = 1;
	int i = L.length;
	cout << "请输入数据,按0结束!";
	while (a)
	{
		cin >> a;
		L.elem[i].p = a;
		++i;
		if (a != 0)
		{
			L.length++;
		}
	}
	cout << "添加成功!";
}

void Contents()  //菜单清单
{
	cout << "***************************************\n";
	cout << "*             顺 序 表 练 习          *\n";
	cout << "*                                     *\n";
	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 << "***************************************\n";
}

void main(){   //主函数

	
	Sqlist L;
	Elem e;
	int flag,a,n,k,b;
	flag = 1;
	while (flag)
	{
		system("cls");
		Contents();
		cin >> a;
		switch (a)
		{
			case 1: if (InitList_Sq(L)){ cout << "数据录取完毕!"; system("PAUSE"); break; }
					else{ cout << "失败!"; break; }
			case 2: PrintList(L); system("PAUSE"); break;
			case 3: exit(-1);
			case 4: if (DestoryList(L)){ cout << "顺序表销毁成功!"; }else{cout << "书序表不存在,销毁失败!";} system("PAUSE"); break;
			case 5:	cout << GetLength(L); system("PAUSE"); break;
			case 6: cout << "查找第几个位置上的数据?"; cin >> n; cout << L.elem[n - 1].p; system("PAUSE"); break;
			case 7: ClearList(L); cout << "成功将顺序表置空!"; system("PAUSE"); break;
			case 8: cout << "输入插入的数据的位置:"; cin >> k; cout << "\n"; cout << "请输入要插入的数据:"; cin >> b; 
				if (InsertList(L, k, b)){ cout << "插入成功!"; }else {cout<<"插入失败";}system("PAUSE"); break;
			case 9: cout << "输入要删除第几个数据:"; cin >> k; if (DeleteList(L, k)){ cout << "删除成功!"; }
					else { cout << "删除失败"; }system("PAUSE"); break;
			case 10: cout << "输入你要第几个数据:"; cin >> k; if (SearchList(L, k)) { cout << "查找成功!" << L.elem[SearchList(L, k)].p; }
					 else { cout << "查找失败"; }system("PAUSE"); break;
			case 11: AddList(L); system("PAUSE"); break;
			default: printf("输入错误!请重新输入"); system("PAUSE"); break;
		}
	}
}

顺序表的话必须有两个自定义的抽象函数类型。
连续存储,用物理存储的位置来描述数据的逻位置关系(有唯一前趋和后继(除第一个和最后一个元素以外))。
存取元素方法:随机存取。
时间复杂度(查找、插入、删除):O(n)
空间复杂度:S(n)= O(1)

优点:
存取密度大
可以随机存取表中任意一个元素
缺点:
插入删除需要移动大量元素
浪费存储空间
不能自由分配存储空间

顺序表的Demo分享到这,不太会的同学可以留言问我,大家一同学习

  • List item

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值