顺序表代码实现

顺序表代码实现

定义宏

#define MaxSize 100

定义 MaxSize 为100,后续用来初始化顺序表

结构体来构建顺序表

typedef struct  
{
	DataType data[MaxSize];
	int length;
}SeqList;     //结构体重命名

创建 DataType 类型的数组,数组名为 data ,长度为100(MaxSize)
length 代表当前顺序表含有的元素个数 ,该变量在后续操作中有着极大的作用
将该结构重命名为 SeqList ,方便后续代码的书写

数据类型的重定义

typedef int DataType;   //数据类型的重命名

之后如果要使用其他的数据类型,只需要修改此处的 int 大大节省时间

初始化顺序表

void InitList(SeqList* L)   //初始化顺序表
{
	L->length = 0;   //顺序表初始长度位0;
}

只需要将其设置为 0 即可

建立顺序表

int CreatList(SeqList* L, DataType a[], int n)  //创建线性表
{
	if (n > MaxSize)
	{
		cout << "顺序表空间不足,无法构建顺序表";
		return 0;   //建立失败,返回0
	}
	else
	{
		for (int i = 0; i < n; i++)
		{
			L->data[i] = a[i];
		}
		L->length = n;
		return 1;   //建立成功,返回1
	}
}

将数组 a 中的元素依次载入顺序表,n为数组长度,若 n 大于 100(MaxSize) ,则说明该顺序表长度够,无法载入全部数据,返回 0,否则载入成功,返回1

注意:该函数用来将已有的数组中的元素载入顺序表

插入元素

int Insert(SeqList* L, int i, DataType x) //插入元素函数
{
	if (L->length >= MaxSize)
	{
		cout << "上溢错误,插入失败" << endl;
		return 0;
	}
	if (i<1 || i>L->length + 1)  //插入至数组最后一个元素的后面,则位置错误
	{
		cout << "位置错误,插入失败" << endl;
		return 0;
	}
	for (int j = L->length; j >= i; j--)//若插入的元素在线性表最后一个元素及之前,则执行改语句,否则不执行;直接对语句进行追加
	{
		L->data[j + 1] = L->data[j];
	}
	L->data[i-1] = x;  //线性表中插入第3个位置,则在数组则是下标-1的位置,所以要i-1
	L->length += 1;
	return 1;
}

L->length >= MaxSize 判断顺序表是否为满,若顺序表已满无法插入,返回0,并提示上溢错误

i<1 || i>L->length + 1 判断插入的位置是否正确,i 代表插入的位置,插入到小于 1 或者大于 length +1 的位置都是不正确的

(i 最多只能插入到 1 的位置,不能插入到小于 1 的地方;同时 i 最多插入到当前顺序表的最后,即有9个元素,L-> length 等于9 ,最多插入到10,不能插入到11,12等位置,所以要小于length+1)

若位置错误,返回0,并提示错误信息;若没有发生这两种情况,则可以插入,并返回 1

删除元素

int Delete(SeqList* L, int i, DataType* ptr)
{
	if (L->length==0)
	{
		cout << "下溢错误,删除失败" << endl;
		return 0;
	}
	if (i<1 || i>L->length)
	{
		cout << "位置错误,删除失败" << endl;
		return 0;
	}
	*ptr = L->data[i - 1];
	for (int j = i; j < L->length; j++)
	{
		L->data[i - 1] = L->data[i];
	}                              
	L->length -= 1;
	return 1;
}

与插入元素的函数类似,判断删除的位置 i 是否正确,这里与插入的思路相同,不再细讲
若删除成功,则返回 1,否则返回 0 ,和错误信息

查找(按位查找)

int Get(SeqList* L, int i, DataType* ptr)  //按位查找
{
	if (i<1 || i>L->length)
	{
		cout << "查找位置非法,查找失败" << endl;
		return 0;  //查找失败,返回0
	}
	else
	{
		*ptr =L->data[i-1];//线性表第i个元素储存在数组第[i-1]位上
		return 1;
	}
}

先判断查找的位置 i ,是否正确,若正确,则将 data [ i-1 ] 赋值给 *ptr ,并返回 1

解释下为什么是 i - 1,而不是 i :
在数组中,数据元素存放是从下表 0 开始的,(比如存放 10,20,30这三个元素,在现实中,10在第一个位置,20在第二,30在第三,但在计算机中,10在下标 0 处,20在下表 1 处,30在下标 2处,所以查找第 i 个位置的元素,在数组中的第 i-1个位置处)

查找(按值查找)

int Locate(SeqList* L,DataType x)  //查找,按值查找
{
	for (int i = 0; i < L->length; i++)
	{
		if (x == L->data[i])
			return i + 1;  
	}
	return -1}

与按位查找不同,按值查找会遍历整个顺序表,直到找到该值的元素,返回其下标,若没找到,则返回 -1

与按位查找相同,数据在数组中是从0开始的,但我们返回的是现实中该元素的位置,现实中是从1开始的,所以需要加上1

遍历操作

void PrintList(SeqList* L) //遍历操作,输出顺序表中的各数据元素;
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->data[i] << " ";
	}
}

遍历整个数组,并打印数据到屏幕上

求线性表的长度

int Length(SeqList* L)  //求线性表的长度,输出线性表中元素个个数
{
	return L->length;
}

直接访问结构体的 length 即可

主函数

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	SeqList con;
	InitList(&con);
	CreatList(&con, arr, 10);
	PrintList(&con);
	cout << endl;
	Insert(&con, 1, 100);
	PrintList(&con);
	cout << endl;
	int num = 0;
	Delete(&con, 11, &num);
	cout << num << endl;
	PrintList(&con);
	cout << endl;
	cout << Length(&con) << endl;
	cout << Locate(&con, 2) << endl;
	Get(&con, 5, &num);
	cout << num << endl;
}

运行结果

在这里插入图片描述

全部代码

#include<iostream>
using namespace std;
#define MaxSize 100
typedef int DataType;   //数据类型的重定义
typedef struct   //结构体重定义
{
	DataType data[MaxSize];
	int length;
}SeqList;//SeqList : 线性表

void InitList(SeqList* L)   //初始化顺序表
{
	L->length = 0;   //顺序表长度位0;
}
int CreatList(SeqList* L, DataType a[], int n)  //创建线性表
{
	if (n > MaxSize)
	{
		cout << "顺序表空间不足,无法构建顺序表";
		return 0;   //建立失败,返回0
	}
	else
	{
		for (int i = 0; i < n; i++)
		{
			L->data[i] = a[i];
		}
		L->length = n;
		return 1;   //建立成功,返回1
	}
}
void PrintList(SeqList* L) //遍历操作,输出顺序表中的各数据元素;
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->data[i] << " ";
	}
}
int Length(SeqList* L)  //求线性表的长度,输出线性表中元素个个数
{
	return L->length;
}
int Locate(SeqList* L,DataType x)  //查找,按值查找
{
	for (int i = 0; i < L->length; i++)
	{
		if (x == L->data[i])
			return i + 1;  //顺序表是从1开始的,所以需要加1;
	}
	return -1;
}
int Get(SeqList* L, int i, DataType* ptr)  //按位查找
{
	if (i<1 || i>L->length)
	{
		cout << "查找位置非法,查找失败" << endl;
		return 0;  //查找失败,返回0
	}
	else
	{
		*ptr =L->data[i-1];  //线性表第i个元素储存在数组第[i-1]位上
		return 1;
	}
}
int Insert(SeqList* L, int i, DataType x) //插入元素函数
{
	if (L->length >= MaxSize)
	{
		cout << "上溢错误,插入失败" << endl;
		return 0;
	}
	if (i<1 || i>L->length + 1)  //插入至数组最后一个元素的后面,则位置错误
	{
		cout << "位置错误,插入失败" << endl;
		return 0;
	}
	for (int j = L->length; j >= i-1; j--)//若插入的元素在线性表最后一个元素及之前,则执行改语句,否则不执行;直接对语句进行追加
	{
		L->data[j + 1] = L->data[j];
	}
	L->data[i-1] = x;  //线性表中插入第3个位置,则在数组则是下标-1的位置,所以要i-1
	L->length += 1;
	return 1;
}
int Delete(SeqList* L, int i, DataType* ptr)
{
	if (L->length==0)
	{
		cout << "下溢错误,删除失败" << endl;
		return 0;
	}
	if (i<1 || i>L->length)
	{
		cout << "位置错误,删除失败" << endl;
		return 0;
	}
	*ptr = L->data[i - 1];
	for (int j = i; j < L->length; j++)
	{
		L->data[i - 1] = L->data[i];
	}                                     //感觉最后一个元素会残留
	L->length -= 1;
	return 1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	SeqList con;
	InitList(&con);
	CreatList(&con, arr, 10);
	PrintList(&con);
	cout << endl;
	Insert(&con, 1, 100);
	PrintList(&con);
	cout << endl;
	int num = 0;
	Delete(&con, 11, &num);
	cout << num << endl;
	PrintList(&con);
	cout << endl;
	cout << Length(&con) << endl;
	cout << Locate(&con, 2) << endl;
	Get(&con, 5, &num);
	cout << num << endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ryan.Alaskan Malamute

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

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

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

打赏作者

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

抵扣说明:

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

余额充值