线性表的顺序存储

静态分配

#define MaxSize 100//宏定义数组大小
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//自定义数据类型
typedef int ElemType;
#include<iostream>
using namespace std;

typedef struct
{
	ElemType date[MaxSize];//数据存储
	int length;//线性表长度
}SqList;

void InitList(SqList& L)//初始化线性表
{
	for (int i = 0; i < MaxSize; i++)
	{
		L.date[i] = 0;
	}
	L.length = 0;
}

Status ListInsert(SqList& L, int i, ElemType e)//在某一位置插入元素
{
	if (i<1 || i>L.length + 1) return ERROR;//当位置有误时退出
	if (L.length == MaxSize) return ERROR;//满表则退出
	for (int j = L.length; j > i - 1; j--)//最后的元素开始依次后挪一位
	{
		L.date[j] = L.date[j - 1];//后一个元素等于前一个元素
	}
	L.date[i - 1] = e;//目标位置为e
	++L.length;
	return TRUE;
}

Status ListInsertHead(SqList& L, ElemType e)//线性表头插法
{
	if (L.length == MaxSize) return ERROR;//满表则退出
	for (int j = L.length; j > 0; j--)//最后的元素开始依次后挪一位
	{
		L.date[j] = L.date[j - 1];//后一个元素等于前一个元素
	}
	L.date[0] = e;//令第一个元素为所插入元素
	++L.length;//表长加一
	return TRUE;
}

Status ListInsertBack(SqList& L, ElemType e)//线性表尾插法
{
	if (L.length == MaxSize) return ERROR;//满表则退出
	int j = L.length;
	L.date[j] = e;//最后的元素为e
	++L.length;
	return TRUE;
}

Status ListDelete(SqList& L, int i, ElemType& e)//删除某一位置元素并返回其值
{
	if (L.length == 0) return ERROR;//空表
	if (i<1 || i>L.length) return ERROR;
	e = L.date[i - 1];//记录删除的元素
	for (int j = i; j < L.length; j++)//此后的元素上前一位
	{
		L.date[j - 1] = L.date[j];
	}
	L.length--;//表长减一
	return TRUE;
}

int LocateElem(SqList L, ElemType e)//返回指定元素位置
{
	for (int i = 0; i < L.length; i++)//遍历查找
	{
		if (L.date[i] == e) return i + 1;
	}
	return 0;
}

Status ListRevise(SqList& L, int i, ElemType e)//修改第i个元素
{
	if (L.length == 0) return ERROR;//空表
	if (i<1 || i>L.length) return ERROR;
	L.date[i - 1] = e;//将第i个元素改为e
	return TRUE;
}

ElemType GetElem(SqList L, int i)//返回第i个元素
{
	if (i<1 || i>L.length) return ERROR;//当位置有误时退出
	return L.date[i - 1];
}

void PrintList(SqList L)//打印线性表
{
	cout << "线性表的元素:";
	for (int i = 0; i < L.length; i++)
	{
		cout << L.date[i] << " ";
	}
}

int ListLength(SqList L)//返回线性表长度
{
	cout << endl;
	cout << "线性表的长度:";
	return L.length;
}

Status Empty(SqList L)//判断是否为空表
{
	if (L.length == 0) return TRUE;
	return FALSE;
}

Status ClearList(SqList& L)//清空线性表
{
	L.length = 0;
	return TRUE;
}

int main()
{
	SqList L;//定义线性表
	int n, number;
	int e;//一个整型变量、
	cout << "输入数据个数:";
	cin >> n;//输入数据个数 @3

	InitList(L);//初始化

	for (int i = 1; i < n + 1; i++)//依次插入数据
	{
		cin >> number;//输入元素 4 5 6
		ListInsert(L, i, number);
	}

	ListInsertHead(L, 3);//头插3个元素
	ListInsertHead(L, 2);
	ListInsertHead(L, 1);
	ListInsertBack(L, 7);//尾插3个元素
	ListInsertBack(L, 8);
	ListInsertBack(L, 9);

	PrintList(L);//打印表
	cout << ListLength(L) << endl;

	cout << "值为7的元素的位置:" << LocateElem(L, 7) << endl;

	cout << "第5个位置的元素是:" << GetElem(L, 5) << endl;

	ListDelete(L, 3, e);//删除元素
	cout << "删除的元素是:" << e << endl;
	PrintList(L);
	cout << endl;

	cout << "将第1个元素修改为10->";
	ListRevise(L, 1, 10);
	PrintList(L);
	cout << endl;

	if (Empty(L))  cout << "空表" << endl;
	else  cout << "非空表" << endl;

	ClearList(L);
	PrintList(L);//打印表

	return 0;
}
//优: 无逻辑关系 可随意存取任何元素
//缺: 插入,删除元素需要移动大量元素  存储空间不够灵活 当长度过大难以确定其容量 数据元素不能自由扩充

动态分配

菜单实现

#define MaxSize 5//初始分配空间
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//自定义数据类型
typedef int ElemType;
#include<iostream>
using namespace std;

typedef struct
{
	ElemType* a;//存储空间基地址
	int capacity;//容量大小
	int length;//线性表长度
}SqList;

Status InitList(SqList& L)//初始化线性表
{
	L.a =(ElemType*) malloc(MaxSize * sizeof(ElemType));//申请分配空间
	if (!L.a) return ERROR;
	L.length = 0;
	L.capacity = MaxSize;
	return TRUE;
}

void ListCapacityCheck(SqList& L)//表满的增容操作
{
	int newcapacity = L.capacity * 2;//新容量扩大为2倍
	ElemType* elem = (ElemType*)realloc(L.a, newcapacity * sizeof(ElemType));//开辟一个新空间
	if (!elem) exit(-1);//增容失败
	L.a = elem;//指向新地址
	L.capacity = newcapacity;
}

Status ListInsert(SqList& L, int i, ElemType e)//在某一位置插入元素
{
	if (L.length >= L.capacity)//表满
		ListCapacityCheck(L);
	for (int j = L.length - 1; j >= i - 1; j--)//自插入位置前一位开始
	{
		L.a[j + 1] = L.a[j];//依次向后挪一位
	}
	L.a[i - 1] = e;//插入位置赋值
	L.length++;//表长加一
	return TRUE;

}

Status ListInsertHead(SqList& L, ElemType e)//线性表头插法
{
	if (L.length >= L.capacity)//表满
		ListCapacityCheck(L);
	for (int i = L.length - 1; i >= 0; i--)//每一项后移一位
	{
		L.a[i+1] = L.a[i];
	}
	L.a[0] = e;//表头赋值
	L.length++;
	return TRUE;
}

Status ListInsertBack(SqList& L, ElemType e)//线性表尾插法
{
	if (L.length >= L.capacity)//表满
		ListCapacityCheck(L);
	L.a[L.length] = e;//赋值
	L.length++;//表长加一
	return TRUE;
}

Status ListDeleteBack(SqList& L)//尾删
{
	if (L.length == 0) return ERROR;
	L.length--;
	return TRUE;
}

Status ListDeleteHead(SqList& L)//头删
{
	if (L.length == 0) return ERROR;
	for (int i = 1; i < L.length ; i++)//从第二项开始向前挪一位
	{
		L.a[i-1] = L.a[i];
	}
	L.length--;
	return TRUE;
}

Status ListDelete(SqList& L, int i, ElemType &e)//指定位置删除
{
	if (L.length == 0) return ERROR;
	if (i<1 || i>L.length) return ERROR;
	e = L.a[i - 1];//记录删除元素
	for (int j = i; j < L.length; j++)//从被删除的后一位开始前移一位
	{
		L.a[j - 1] = L.a[j];
	}
	L.length--;
	return TRUE;
}

int LocateElem(SqList L, ElemType e)//返回指定元素位置
{
	for (int i = 0; i < L.length ; i++)
	{
		if (L.a[i] == e)
			return i + 1;
	}
	return 0;
}

Status ListRevise(SqList& L, int i, ElemType e)//修改第i个元素
{
	if (L.length == 0) return ERROR;
	if (i<1 || i>L.length) return ERROR;
	L.a[i - 1] = e;
	return TRUE;
}

ElemType GetElem(SqList L, int i)//返回第i个元素
{
	if (L.length == 0) return ERROR;
	if (i<1 || i>L.length) return ERROR;
	return L.a[i - 1];
}

void PrintList(SqList L)//打印线性表
{
	cout << "线性表元素:";
	for (int i = 0; i < L.length; i++)
	{
		cout << L.a[i] << " ";
	}
	cout << endl;
}

int ListLength(SqList L)//返回线性表长度
{
	if (!L.a) return ERROR;
	return L.length;
}

int ListCapacity(SqList L)//返回容量
{
	if (!L.a) return ERROR;
	return L.capacity;
}

Status Empty(SqList L)//判断是否为空表
{
	if (!L.a) return ERROR;
	if (L.length == 0) return TRUE;
	return FALSE;
}

Status ListDestory(SqList& L)//销毁表
{
	free(L.a);
	L.a = NULL;
	L.length = L.capacity = 0;
	return TRUE;
}
Status ClearList(SqList& L)//清空线性表
{
	if(L.length)
	    L.length = 0;
	return TRUE;
}
void show()
{
	cout << "输入你想要的操作" << endl;
	cout << "1.尾插法------------" << endl;
	cout << "2.头插法------------" << endl;
	cout << "3.指定位置插入------" << endl;
	cout << "4.尾删--------------" << endl;
	cout << "5.头删--------------" << endl;
	cout << "6.指定位置删--------" << endl;
	cout << "7.线性表的长度和容量" << endl;
	cout << "8.更改元素----------" << endl;
	cout << "9.清空表------------" << endl;
	cout << "10.销毁表-----------" << endl;
	cout << "11.返回某位置元素---" << endl;
	cout << "12.返回元素的位置---" << endl;
	cout << "13.输出线性表------" << endl;
	cout << "0.退出--------------" << endl;
}

void menu()
{
	show();
	SqList L;//定义线性表
	InitList(L);//初始化
	int n = 1;
	int locate;
    ElemType number;
	ElemType e;
	
	while (n )
	{
		cin >> n;
		switch (n)
		{
		case 1://尾插数据
			cout << "输入五个数:";
			for (int i = 0; i < 5; i++)
			{
				cin >> number;
				ListInsertBack(L, number);
			}
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 2://头插数据
			cout << "输入一个数:";
			cin >> number;
			ListInsertHead(L, number);
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 3://指定位置插入
			cout << "输入要插入的位置";
			cin >> locate;
			cout << "元素";
			cin >> number;
			ListInsert(L, locate, number);
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 4://尾删
			ListDeleteBack(L);
			cout << "尾删后:";
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 5://头删
			ListDeleteHead(L);
			cout << "头删后:";
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 6://指定位置删除
			cout << "输入要删除的位置";
			cin >> locate;
			ListDelete(L, locate,e);
			PrintList(L);
			cout << "被删除的元素->" << e <<endl;
			cout << "输入下次操作->";
			break;
		
		case 7://长度及容量
			cout << "线性表的长度:" << ListLength(L) << "容量:" << ListCapacity(L) << endl;
			cout << "输入下次操作->";
			break;

		case 8://更改元素
			cout << "输入修改位置:";
			cin >> locate;
			cout << "输入新的数据:";
			cin >> number;
			ListRevise(L, locate, number);
			PrintList(L);
			cout << "输入下次操作->";
			break;
		
		case 9://清空表
			ClearList(L);
			cout << "输入下次操作->";
			break;

		case 10://销毁
			cout << "销毁后只能执行退出!" << endl;
			ListDestory(L);
			break;
			
		case 11://返回某位置元素
			cout << "你想知道第几个元素:";
			cin >> locate;
			cout<<"他是->"<<GetElem(L, locate)<<endl;
			cout << "输入下次操作->";
			break;

		case 12://返回元素位置
			cout << "你想知道的元素:";
			cin >> e;
			LocateElem(L, e);
			if (LocateElem(L,e) == 0) cout << "没有找到请换一个输入!" << endl;
			else cout << "在这->" << LocateElem(L, e) << endl;
			cout << "输入下次操作->";
			break;

		case 13://打印线性表
			PrintList(L);
			cout << "输入下次操作->";
			break;

		case 0://结束
			cout << "退出线性表"<< endl;
			cout << "输入0结束程序" << endl;
			break;
		
		default:
			cout << "输入错误"<<endl; 
			break;
		}
	}
}

int main()
{
	int flag;
	cout << "输入1开始--" << endl;
	cout << "输入0结束--" << endl;
	do
	{
		cin >> flag;
		
		switch (flag)
		{
		case 1:
			menu();
			break;
		case 0:
			cout << "结束";
			return 0;
		default:
			break;
		}
	}while(flag);
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奥奖得主

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

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

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

打赏作者

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

抵扣说明:

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

余额充值