数据结构与算法——顺序表

01、顺序表数据结构

typedef struct
{
	ElemType data[MaxSize];//顺序表元素
	int length;            //顺序表当前长度
}SqList;                   //顺序表的数据类型 


02、顺序表的基本操作函数

2.1、初始化顺序表函数

//构造一个空的顺序表
void InitList(SqList &L)
{
	for(int i = 0;i<MaxSize;i++)
		L.data[i] = 0;
	L.length = 0;                //初始化长度为0

}

2.2、静态创建顺序表

//静态创建顺序表函数 初始化前n个数据
bool CreateList(SqList &L, int n)
{
	if (n<0 || n>MaxSize)
	return false;//n非法
	for (int i = 0; i<n; i++)
	{
		scanf("%d", &L.data[i]);
		L.length++;
	}
	return true;
}

2.3动态创建顺序表

//动态增加顺序表的长度
void IncresseSize(SqList &L,int len){
	int *p = L.data;
	L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
	for(int i = 0;i<L.length;i++){
		L.data[i] = p[i];	//将新的数据复制到新区域 
	}
	L.MaxSize = L.MaxSize+len;	//顺序表最大长度增加到len 
	free(p);	//释放原来的内存空间 
} 

2.4、插入函数

//插入函数 位置i插入数据 i及之后元素后移 
bool InsertList(SqList &L, int i, ElemType e)
{
	if (i<1 || i>L.length + 1) //判断i是否合法
	{
		printf("位置无效!!!\n");
		return false;
	}
	if (L.length >= MaxSize)//判断存储空间是否已满
	{
		printf("当前存储空间已满!!!\n");
		return false;
	}
	for (int j = L.length; j >= i; j--)//位置i及之后元素后移
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return true;
}


2.5、删除函数

//删除函数 删除位置i的元素 i之后的元素依次前移
bool  ListDelete(SqList &L, int i,int &e)
{
	if (i<1 || i>L.length)
	{
		printf("位置无效!!!\n");
		return false;
	}
	e = L.data[i-1];//将删除的元素复值给e 
	for (int j = i; j <= L.length - 1; j++)//位置i之后元素依次前移覆盖
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

2.6、查找函数

//查找函数 按位置从小到大查找第一个值等于e的元素 并返回位置
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i<L.length; i++)//从低位置查找
	{
		if (L.data[i] == e)
			return i + 1;
	}
	return 0;
}

2.7、顺序表的反转函数

//倒置函数 将原顺序表直接倒置
void Reverse(SqList &L)
{
	if (L.length)
		for (int i = 0; i<L.length - 1 - i; i++)
		{
			int t = L.data[i];
			L.data[i] = L.data[L.length - 1 - i];
			L.data[L.length - 1 - i] = t;
		}
}

2.8、顺序表的清除函数

//清空顺序表
void ClearList(SqList &L) {
	L.length = 0;
}

03、功能函数

3.1、创建顺序表函数

//创建顺序表函数
void Create(SqList &L)
{
	int n;
	bool flag;
	L.length = 0;
	printf("请输入要创建的顺序表长度(>1):");
	scanf("%d", &n);
	printf("请输入%d个数(空格隔开):", n);
	flag = CreateList(L, n);
	if (flag) {
		printf("创建成功!\n");
		PrintList(L);
	}
	else printf("输入长度非法!\n");
 
}

3.2、插入功能函数

//插入功能函数 调用InsertList完成顺序表元素插入 调用PrintList函数显示插入成功后的结果
void Insert(SqList &L)
{
	int place; 
	ElemType e; 
	bool flag;
	printf("请输入要插入的位置(从1开始)及元素:\n");
	scanf("%d%d", &place, &e);
	flag = InsertList(L, place, e);
	if (flag)
	{
		printf("插入成功!!!\n");
		PrintList(L);
	}
}

3.3、删除功能函数

//删除功能函数 调用ListDelete函数完成顺序表的删除 调用PrintList函数显示插入成功后的结果
void Delete(SqList &L)
{
	int place,e;
	bool flag;
	printf("请输入要删除的位置(从1开始):\n");
	scanf("%d", &place,e);
	flag = ListDelete(L, place,e);
	if (flag)
	{
		printf("删除成功!!!\n");
		printf("删除的元素为:%d\n",e);
		PrintList(L);
	}
}

3.4、查找功能函数

//查找功能函数 调用LocateElem查找元素
void Search(SqList L)
{
	ElemType e; 
	int flag;
	printf("请输入要查找的值:\n");
	scanf("%d", &e);
	flag = LocateElem(L, e);
	if (flag)
	{
		printf("该元素位置为:%d\n", flag);
	}
	else
		printf("未找到该元素!\n");
}

3.5、输出功能函数

//输出功能函数 按位置从小到大输出顺序表所有元素
void PrintList(SqList L)
{
	printf("当前顺序表所有元素:");
	for (int i = 0; i<L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

04、菜单函数

//菜单
void menu()
{
	printf("********1.创建                        2.插入*********\n");
	printf("********3.删除                        4.查找*********\n");
	printf("********5.倒置                        6.输出*********\n");
	printf("********7.清空                        8.退出*********\n");
}


05、主函数

int main()
{
	SqList L; 
	int choice;
	InitList(L);
	while (1)
	{
		menu();
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (8 == choice) break;
		switch (choice)
		{
		case 1:Create(L); break;
		case 2:Insert(L); break;
		case 3:Delete(L); break;
		case 4:Search(L); break;
		case 5:Reverse(L); break;
		case 6:PrintList(L); break;
		case 7:ClearList(L); break;
		default:printf("输入错误!!!\n");
		}
	}
	return 0;
}

06、整合代码


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>

#define MaxSize 100
#define ElemType int



using namespace std;
//顺序表数据结构
typedef struct
{
	ElemType data[MaxSize];//顺序表元素
	int length;            //顺序表当前长度
}SqList;                   //顺序表的数据类型 


//***************************基本操作函数*******************************//
//初始化顺序表函数,构造一个空的顺序表 
void InitList(SqList &L)
{
	for(int i = 0;i<MaxSize;i++)
		L.data[i] = 0;
	L.length = 0;                //初始化长度为0
	return 0;
}


//静态创建顺序表函数 初始化前n个数据
bool CreateList(SqList &L, int n)
{
	if (n<0 || n>MaxSize)
	return false;//n非法
	for (int i = 0; i<n; i++)
	{
		scanf("%d", &L.data[i]);
		L.length++;
	}
	return true;
}



/*
//动态增加顺序表的长度
void IncresseSize(SqList &L,int len){
	int *p = L.data;
	L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
	for(int i = 0;i<L.length;i++){
		L.data[i] = p[i];	//将新的数据复制到新区域 
	}
	L.MaxSize = L.MaxSize+len;	//顺序表最大长度增加到len 
	free(p);	//释放原来的内存空间 
} 


*/


//插入函数 位置i插入数据 i及之后元素后移 
bool InsertList(SqList &L, int i, ElemType e)
{
	if (i<1 || i>L.length + 1) //判断位置是否有效
	{
		printf("位置无效!!!\n");
		return false;
	}
	if (L.length >= MaxSize)//判断存储空间是否已满
	{
		printf("当前存储空间已满!!!\n");
		return false;
	}
	for (int j = L.length; j >= i; j--)//位置i及之后元素后移
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return true;
}


//删除函数 删除位置i的元素 i之后的元素依次前移
bool  ListDelete(SqList &L, int i,int &e)
{
	if (i<1 || i>L.length)
	{
		printf("位置无效!!!\n");
		return false;
	}
	e = L.data[i-1];//将删除的元素复值给e 
	for (int j = i; j <= L.length - 1; j++)//位置i之后元素依次前移覆盖
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}


//查找函数 按位置从小到大查找第一个值等于e的元素 并返回位置
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i<L.length; i++)//从低位置查找
	{
		if (L.data[i] == e)
			return i + 1;
	}
	return 0;
}
//倒置函数 将原顺序表直接倒置
void Reverse(SqList &L)
{
	if (L.length)
		for (int i = 0; i<L.length - 1 - i; i++)
		{
			int t = L.data[i];
			L.data[i] = L.data[L.length - 1 - i];
			L.data[L.length - 1 - i] = t;
		}
}

//清空顺序表
void ClearList(SqList &L) {
	L.length = 0;
}



//********************************功能函数

*****************************************//


//输出功能函数 按位置从小到大输出顺序表所有元素
void PrintList(SqList L)
{
	printf("当前顺序表所有元素:");
	for (int i = 0; i<L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

//创建顺序表函数
void Create(SqList &L)
{
	int n;
	bool flag;
	L.length = 0;
	printf("请输入要创建的顺序表长度(>1):");
	scanf("%d", &n);
	printf("请输入%d个数(空格隔开):", n);
	flag = CreateList(L, n);
	if (flag) {
		printf("创建成功!\n");
		PrintList(L);
	}
	else printf("输入长度非法!\n"); 
}


//插入功能函数 调用InsertList完成顺序表元素插入 调用PrintList函数显示插入成功后的结果
void Insert(SqList &L)
{
	int place; 
	ElemType e; 
	bool flag;
	printf("请输入要插入的位置(从1开始)及元素:\n");
	scanf("%d%d", &place, &e);
	flag = InsertList(L, place, e);
	if (flag)
	{
		printf("插入成功!!!\n");
		PrintList(L);
	}
}

//删除功能函数 调用ListDelete函数完成顺序表的删除 调用PrintList函数显示插入成功后的结果
void Delete(SqList &L)
{
	int place,e;
	bool flag;
	printf("请输入要删除的位置(从1开始):\n");
	scanf("%d", &place,e);
	flag = ListDelete(L, place,e);
	if (flag)
	{
		printf("删除成功!!!\n");
		printf("删除的元素为:%d\n",e);
		PrintList(L);
	}
}


//查找功能函数 调用LocateElem查找元素
void Search(SqList L)
{
	ElemType e; 
	int flag;
	printf("请输入要查找的值:\n");
	scanf("%d", &e);
	flag = LocateElem(L, e);
	if (flag)
	{
		printf("该元素位置为:%d\n", flag);
	}
	else
		printf("未找到该元素!\n");
}



//菜单
void menu()
{
	printf("********1.创建                        2.插入*********\n");
	printf("********3.删除                        4.查找*********\n");
	printf("********5.倒置                        6.输出*********\n");
	printf("********7.清空                        8.退出*********\n");
}



int main()
{
	SqList L; 
	int choice;
	InitList(L);
	while (1)
	{
		menu();
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (8 == choice) break;
		switch (choice)
		{
		case 1:Create(L); break;
		case 2:Insert(L); break;
		case 3:Delete(L); break;
		case 4:Search(L); break;
		case 5:Reverse(L); break;
		case 6:PrintList(L); break;
		case 7:ClearList(L); break;
		default:printf("输入错误!!!\n");
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值