栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【数据结构-顺序表】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据结构-顺序表】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、顺序表的定义
  • 二、顺序表的基本操作
    • 1.头文件及宏定义
    • 2.结构体定义
    • 3.顺序表初始化
    • 4.动态增加数组长度
    • 5.顺序表遍历
    • 6.顺序表长度
    • 7.顺序表判空
    • 8.顺序表的插入操作(在指定位置上插入指定的元素)
    • 9.顺序表的删除操作(删除指定位置上的元素)
    • 10.顺序表的删除操作(删除指定的元素)
    • 11.查找指定元素所在的位置
    • 12.查找指定位置上的元素
    • 13.顺序表销毁
  • 三、代码
  • 总结


前言
一、顺序表的定义

线性表的顺序存储又称为顺序表。【一组地址连续的存储空间】

二、顺序表的基本操作 1.头文件及宏定义
#include
#include
#include 
#define InitSize 10 //默认的最大长度
2.结构体定义
typedef struct {
	int* data;//动态分配数组的指针
	int MaxSize; //顺序表的最大容量
	int length;  //顺序表的当前长度 
}SqList;
3.顺序表初始化
void InitList(SqList *L) {
	//用malloc函数申请一片连续的存储空间  格式:(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
	L->data = (int*)malloc(InitSize * sizeof(int));
	//(*L).data = (int*)malloc(InitSize * sizeof(int));
	L->length = 0; //当前长度设置为0
	L->MaxSize = InitSize;
}
4.动态增加数组长度
void IncreaseSize(SqList * L, int len) {
	int* p = L->data;  // 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);  //释放原来的内存空间 
}
5.顺序表遍历
void PrintList(SqList* L) {
	for (int i = 0; i < L->length; i++) {
		printf("data[%d]=%dn", i, L->data[i]);
	}
}
6.顺序表长度
int ListLength(SqList *L) {
	return L->length;
}
7.顺序表判空
void ListEmpty(SqList*L) {
	int emptyFlag =L->length==0?1:0;
	if (emptyFlag==1)
	{
		printf("顺序表为空!n");
	}
	else{
		printf("顺序表bu为空!n");
	}
}
8.顺序表的插入操作(在指定位置上插入指定的元素)
void ListInsert(SqList* L, int i, int e) {
	if (i<1 || i>L->length + 1) {
		printf("Insert failed!n");
		return;
	}
	else{
		if (L->length >= L->MaxSize) {
			IncreaseSize(&L, 5); //自动增加5个长度
		}
		for (int j = L->length; j >= i; j--) //将第i个位置及其后面所有的元素向后移
		{
			L->data[j] = L->data[j - 1];
		}
		L->data[i - 1] = e;  //第i个位置对应数组中i-1编号位置
		L->length++;
		return;
	}
}
9.顺序表的删除操作(删除指定位置上的元素)
void ListDelete(SqList* L, int i) {
	if (i<1 || i>L->length + 1) {
		printf("Delete failed!n");
		return;
	}
	else
	{
		for (int j = i-1; j length-1; j++) //将第i个位置及其后面所有的元素向后移
		{
			L->data[j] = L->data[j+1];
		}
		L->length--;
		return;
	}
}
10.顺序表的删除操作(删除指定的元素)
void ListDeleteElem(SqList* L, int e) {
	//1.查找元素e所在的位置
	int flag = 0; //用来标志是否查找到
	for (int i = 0; i < L->length; i++)
	{
		//2.删除查找元素e
		if (L->data[i] == e)
		{
			for (int j = i; j < L->length; j++) //将第i个位置及其后面所有的元素向后移
			{
				L->data[j] = L->data[j + 1];
			}
			L->length--;
			flag++;
		}	
	}

	if (flag != 0)
	{
		printf("未查找到元素[%d],故Delete failed!n", e);
		return;
	}
	else
	{
		printf("Delete succeed!n");
		return;
	}

	return;
}
11.查找指定元素所在的位置
void ListLocateElem(SqList* L, int e) {
	int locat[100];//用于存放元素e的位置
	int flag = 0; //用来标志是否查找到
	for (int i = 0,j=0; i < L->length; i++) 
	{
		if (L->data[i] == e)
		{
			locat[j] = i + 1;
			j++;
			flag = j;
		}
	}

	if (flag !=0)
	{
		printf("元素[%d]所在的位置为:",e);
		for (int i = 0; i < flag; i++)
		{
			printf("%d ",locat[i]);
		}
		printf("n");
	}
	else
	{
		printf("元素[%d]未查找到!n",e);
	}
	
	return 0;
}

12.查找指定位置上的元素
int getElme(SqList *L,int i) {
	if (i<0||i>L->length)
	{
		printf("超过查找位置的范围,get failed!n");
		return -1;
	}
	else
	{
		printf("第%d上的元素为:%dn",i,L->data[i]);
		return L->data[i - 1];
	}
	
}
13.顺序表销毁
void DestroyList(SqList*L) {
	L->length = 0;
	L->MaxSize = 0;
	free(L->data);
	L->data = NULL;
}
三、代码

代码如下(示例):(顺序表静态分配方式)

#include

 //顺序表的类型定义(静态分配方式) 
#include
#define MaxSize 100   //定义表的最大长度 
typedef struct {
	int data[MaxSize];//用静态的"数组"存放数据元素
	int length; //顺序表的当前长度  
}SqList;       

//初始化顺序表
void InitList(SqList * L) {
	for (int i = 0; i < MaxSize; i++) {
		L->data[i] = 0;  //将所有数据元素设置为默认初始值0
	}
	L->length = 0;//当前长度为0
}

//遍历操作
void PrintList(SqList *L) {
	for (int i = 0; i < MaxSize; i++)
	{
		printf("data[%d]=%dn",i,L->data[i]);
	}
}

int main() {
	SqList L;//声明一个顺序表
	InitList(&L);//初始化一个顺序表
	
	//遍历顺序表
	
	PrintList(&L);

	return 0;
}


代码如下(示例):(顺序表动态分配方式)

#include
#include
#include 
#define InitSize 10 //默认的最大长度
typedef struct {
	int* data;//指示动态分配数组的指针
	int MaxSize; //顺序表的最大容量
	int length;  //顺序表的当前长度 
}SqList;
//初始化
void InitList(SqList *L) {
	//用malloc 函数申请一片连续的存储空间  (分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
	L->data = (int*)malloc(InitSize * sizeof(int));
	//(*L).data = (int*)malloc(InitSize * sizeof(int));

	L->length = 0;
	L->MaxSize = InitSize;
}

//增加动态数组的长度
void IncreaseSize(SqList * L, int len) {
	int* p = L->data;  // 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);  //释放原来的内存空间 
}

//遍历
void PrintList(SqList* L) {
	for (int i = 0; i < L->length; i++) {
		printf("data[%d]=%dn", i, L->data[i]);
	}
}
//求表长
int ListLength(SqList *L) {
	return L->length;
}

//判空
void ListEmpty(SqList*L) {
	int emptyFlag =L->length==0?1:0;
	if (emptyFlag==1)
	{
		printf("顺序表为空!n");
	}
	else
	{
		printf("顺序表bu为空!n");
	}
}

//顺序表的插入操作
void ListInsert(SqList* L, int i, int e) {
	if (i<1 || i>L->length + 1) {
		printf("Insert failed!n");
		return;
	}
	else
	{
		if (L->length >= L->MaxSize) {
			IncreaseSize(&L, 5); //自动增加5个长度
		}
		for (int j = L->length; j >= i; j--) //将第i个位置及其后面所有的元素向后移
		{
			L->data[j] = L->data[j - 1];
		}
		L->data[i - 1] = e;  //第i个位置对应数组中i-1编号位置
		L->length++;
		return;
	}
}

//顺序表的删除操作(删除指定位置上的元素)
void ListDelete(SqList* L, int i) {
	if (i<1 || i>L->length + 1) {
		printf("Delete failed!n");
		return;
	}
	else
	{
		for (int j = i-1; j length-1; j++) //将第i个位置及其后面所有的元素向后移
		{
			L->data[j] = L->data[j+1];
		}
		L->length--;
		return;
	}
}
//查找元素e所在的位置
void ListLocateElem(SqList* L, int e) {
	int locat[100];//用于存放元素e的位置
	int flag = 0; //用来标志是否查找到
	for (int i = 0,j=0; i < L->length; i++) 
	{
		if (L->data[i] == e)
		{
			locat[j] = i + 1;
			j++;
			flag = j;
		}
	}

	if (flag !=0)
	{
		printf("元素[%d]所在的位置为:",e);
		for (int i = 0; i < flag; i++)
		{
			printf("%d ",locat[i]);
		}
		printf("n");
	}
	else
	{
		printf("元素[%d]未查找到!n",e);
	}
	
	return 0;
}


//顺序表的删除操作(删除指定的元素e)
void ListDeleteElem(SqList* L, int e) {
	//1.查找元素e所在的位置
	int flag = 0; //用来标志是否查找到
	for (int i = 0; i < L->length; i++)
	{
		//2.删除查找元素e
		if (L->data[i] == e)
		{
			for (int j = i; j < L->length; j++) //将第i个位置及其后面所有的元素向后移
			{
				L->data[j] = L->data[j + 1];
			}
			L->length--;
			flag++;
		}	
	}

	if (flag != 0)
	{
		printf("未查找到元素[%d],故Delete failed!n", e);
		return;
	}
	else
	{
		printf("Delete succeed!n");
		return;
	}

	return;
}
//查找第i个位置上的元素
int getElme(SqList *L,int i) {
	if (i<0||i>L->length)
	{
		printf("超过查找位置的范围,get failed!n");
		return -1;
	}
	else
	{
		printf("第%d上的元素为:%dn",i,L->data[i]);
		return L->data[i - 1];
	}
	
}

//销毁操作
void DestroyList(SqList*L) {
	L->length = 0;
	L->MaxSize = 0;
	free(L->data);
	L->data = NULL;
}

int main(void) {
	SqList L; //声明一个顺序表
	InitList(&L);//初始化顺序表
	IncreaseSize(&L, 5); //增加5个长度容量
  
	ListInsert(&L, 1, 1); //插入元素
    ListInsert(&L, 1, 2);
	ListInsert(&L, 1, 3);
	ListInsert(&L, 3, 4);
	ListInsert(&L, 3, 4);
	ListInsert(&L, 4, 5);
	PrintList(&L); //遍历顺序表

	int length =ListLength(&L);
	printf("顺序表的长度为:%dn",length);

	ListEmpty(&L); //判空

	ListDelete(&L, 1);//删除指定位置上的元素
	PrintList(&L); //遍历顺序表

	ListLocateElem(&L, 4); //查找元素所在的位置
	ListLocateElem(&L, 100);

	getElme(&L, 5);//查找指定位置上的元素
	getElme(&L, 100);

	ListDeleteElem(&L, 4); //删除指定元素
	PrintList(&L); //遍历顺序表


	return 0;
}

总结

多思考,多敲,代码是敲出来的,不是梦出来的!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/916912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号