数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

Posted 晚风(●•σ )

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o相关的知识,希望对你有一定的参考价值。

目录

前言

以下所有代码都经过测试,编译运行软件:Dev-C++ 5.11,若有表述和代码错误感谢指出!!!


一、顺序表的定义

以下操作均为顺序表的静态分配,所以其大小和空间是固定的,可通过MaxSize设置顺序表的最大长度。

#include<stdio.h>
#define MaxSize 10	//可自行更改最大长度
typedef struct 
	int data[MaxSize];	//元素
	int length;			//顺序表的当前长度
 SqList;		//顺序表的类型定义

二、顺序表的初始化

设置顺序表的初始长度为0,即L.length=0。

/*初始化顺序表*/
void InitList(SqList L) 
	L.length=0;

三、顺序表的建立

/*顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	

四、顺序表的输出

顺序表的输出,依次遍历从头到尾输出顺序表中各元素的值,即通过一个for循环,条件<L.length(顺序表的总长度),每次输出元素。

/*顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);

结合以上功能函数,如下,创建一个顺序表,长度为6,其功能是创建一个顺序表并输入元素,再通过函数调用依次输出各元素,数据元素依次为2,6,0,-1,4,8,如下完整代码:

#include<stdio.h>
#define MaxSize 10
typedef struct 
	int data[MaxSize];
	int length;
 SqList;

/*1、初始化顺序表*/
void InitList(SqList L) 
	L.length=0;


/*2、顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	


/*3、顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);


//主函数
int main() 
	SqList L;
	InitList(L);
	CreatList(L);
	printf("顺序表为:\\n"); 
	DispList(L);

首先输入要创建顺序表中的元素个数,然后依次输入各数据元素,最后输出该顺序表,运行结果如下:

五、顺序表的逆序输出

顺序表的逆序输出也就是交换通过折半法,交换数据元素,然后也是通过调用DispList()函数依次遍历顺序表输出。

/*将顺序表中的所有元素逆置并输出*/
void ReverseList(SqList L) 
	int temp;
	for(int i=0; i<L.length/2; i++) 
		temp=L.data[i];
		L.data[i]=L.data[L.length-i-1];
		L.data[L.length-i-1]=temp;
	
	DispList(L);	//调用输出函数

例如,接上一个例子,不过这次是逆序输出顺序表,如下完整代码:

#include<stdio.h>
#define MaxSize 10
typedef struct 
	int data[MaxSize];
	int length;
 SqList;

/*1、初始化顺序表*/
void InitList(SqList L) 
	L.length=0;


/*2、顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	


/*3、顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);


/*4、将顺序表中的所有元素逆置并输出*/
void ReverseList(SqList L) 
	int temp;
	for(int i=0; i<L.length/2; i++) 
		temp=L.data[i];
		L.data[i]=L.data[L.length-i-1];
		L.data[L.length-i-1]=temp;
	
	DispList(L);


//主函数
int main() 
	SqList L;
	InitList(L);
	CreatList(L);
	printf("逆序输出顺序表:\\n");
	ReverseList(L);

运行结果如下:

六、顺序表的插入操作

顺序表的插入操作以位序进行插入元素,这里要注意位序是从1开始的,而c语言中的数组下标是从0开始的,这一点在插入操作中要明白,这里加了一个if语句判断输入的插入位置是否合法,若不合法则会返回false,插入后,要将其后的元素后移,最后数组长度加1。

/*顺序表的插入操作 (在L的位序i处插入元素e)*/
bool ListInsert(SqList &L,int i, int e) 
	if (i<1||i>L.length||L.length>=MaxSize)		//在[1,length+1]内有效且未存满或等于最大长度
		return false;		//插入失败返回 false
	for(int j=L.length; j>=i; j--)	//j变量等于顺序表的长度
		L.data[j]=L.data[j-1];	//将要插入的位置,第i个元素及以后的元素后移,先移动后面的元素,即数组下标小的赋给下标大的
	L.data[i-1]=e;			//由于数组的下标是从0开始的,所以位序要减一,即将要插入的元素e赋值给L.data[i-1]
	L.length++;		//数组长度加1
	return true;		//插入成功返回 true

例如,向之前所创建好的顺序表的位序为3(数组下标为2)处插入数据元素“7”,如下完整代码:

#include<stdio.h>
#define MaxSize 10
typedef struct 
	int data[MaxSize];
	int length;
 SqList;

/*1、初始化顺序表*/
void InitList(SqList L) 
	L.length=0;


/*2、顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	


/*3、顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);


/*4、顺序表的插入操作 (在L的位序i处插入元素e)*/
bool ListInsert(SqList &L,int i, int e) 
	if (i<1||i>L.length||L.length>=MaxSize)		//在[1,length+1]内有效且未存满或等于最大长度
		return false;		//插入失败返回 false
	for(int j=L.length; j>=i; j--)	//j变量等于顺序表的长度
		L.data[j]=L.data[j-1];	//将要插入的位置,第i个元素及以后的元素后移,先移动后面的元素,即数组下标小的赋给下标大的
	L.data[i-1]=e;			//由于数组的下标是从0开始的,所以位序要减一,即将要插入的元素e赋值给L.data[i-1]
	L.length++;		//数组长度加1
	return true;		//插入成功返回 true


//主函数
int main() 
	SqList L;
	InitList(L);
	CreatList(L);
	printf("当前顺序表为:\\n");
	DispList(L);
	ListInsert(L,3,7);	//在顺序表L的位序为3处插入数据元素7
	printf("\\n");
	printf("插入后的顺序表为:\\n");
	DispList(L);

运行结果如下:

七、顺序表的删除操作

顺序表的删除操作同插入操作一样,也是通过位序插入/删除,删除目标元素后,其后的元素要向前移动一格,最后数组长度要减1。

/*顺序表的删除操作 (删除L中第i个位置的元素并引用变量e返回)*/
bool ListDelete(SqList &L,int i,int &e) 
	if (i<1||i>L.length)	//在[1,length+1]内有效
		return false; //删除失败返回true
	e=L.data[i-1];	//将要删除的元素赋值给e,由于是数组所以要i-1
	for(int j=i; j<L.length; j++)
		L.data[j-1]=L.data[j];	//将要删除的位置,第i个元素后的元素前移,先移动前面的元素,即下标大的赋值给下标小的
	L.length--;		//数组长度减1
	return true; 	//删除成功返回true

例如对创建的顺序表,删除第4个元素(位序为4),然后输出顺序表,完整代码如下:

#include<stdio.h>
#define MaxSize 10
typedef struct 
	int data[MaxSize];
	int length;
 SqList;

/*1、初始化顺序表*/
void InitList(SqList L) 
	L.length=0;


/*2、顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	


/*3、顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);


/*4、顺序表的删除操作 (删除L中第i个位置的元素并引用变量e返回)*/
bool ListDelete(SqList &L,int i,int &e) 
	if (i<1||i>L.length)	//在[1,length+1]内有效
		return false; //删除失败返回true
	e=L.data[i-1];	//将要删除的元素赋值给e,由于是数组所以要i-1
	for(int j=i; j<L.length; j++)
		L.data[j-1]=L.data[j];	//将要删除的位置,第i个元素后的元素前移,先移动前面的元素,即下标大的赋值给下标小的
	L.length--;		//数组长度减1
	return true; 	//删除成功返回true


//主函数
int main() 
	SqList L;
	int a;
	int e=0;	//初始化e的值 
	InitList(L);
	CreatList(L);
	printf("当前顺序表为:\\n");
	DispList(L);
	printf("\\n");
	printf("请输入想删除的元素位置:\\n",a);
	scanf("%d",&a);
	if (ListDelete(L,a,e))
		printf("已删除顺序表中第%d个元素,其元素值为%d\\n",a,e);
	else
		printf("输入的位序i不合法,删除操作失败!\\n");
	printf("当前顺序表为:\\n");
	DispList(L);
	return 0;

运行结果如下:

八、顺序表的按位和按值查找

顺序表的按位查找是以数组下标进行查找的,所以位序要减1,即L.data[i-1]。

/*顺序表的按位查找 (获取L中第i个位置元素的值)*/
int GetElem(SqList L,int i) 
	return L.data[i-1];		//立即找到第i个元素

顺序表的按值查找是,查找L中第一个元素值等于e的元素,它会依次沿着顺序表向后查找,找到后返回其位序。

/*顺序表的按值查找 (查找L中第一个元素值等于e的元素并返回其次序)*/
int LocateElem(SqList L,int e) 
	for(int i=0; i<L.length; i++) 	//依次从前往后查找
		if(L.data[i]==e)
			return i+1;	//数组下标为i的元素值为e,返回其位序i+1(数组从0开始)
	return 0;	//未找到元素,退出循环查找失败

例如对创建的顺序表,查询顺序表中第3个位置的数据元素,另外查询顺序表中第一个元素值等于“4”的数据元素,其完整代码如下:

#include<stdio.h>
#define MaxSize 10
typedef struct 
	int data[MaxSize];
	int length;
 SqList;

/*1、初始化顺序表*/
void InitList(SqList L) 
	L.length=0;


/*2、顺序表的建立*/
void CreatList(SqList &L) 
	printf("请输入建立顺序表的元素个数:\\n");
	scanf("%d",&L.length);
	for(int i=0; i<L.length; i++) 
		int number=i+1;
		printf("请输入第%d个整数:\\n",number);
		scanf("%d",&L.data[i]);
	


/*3、顺序表的输出(从头到尾输出顺序表中各元素的值)*/
void DispList(SqList L) 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);


/*4、顺序表的按位查找 (获取L中第i个位置元素的值)*/
int GetElem(SqList L,int i) 
	return L.data[i-1];		//立即找到第i个元素


/*5、顺序表的按值查找 (查找L中第一个元素值等于e的元素并返回其次序)*/
int LocateElem(SqList L,int e) 
	for(int i=0; i<L.length; i++) 	//依次从前往后查找
		if(L.data[i以上是关于数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法全套数据结构笔记持续更新

数据结构与算法全套数据结构笔记持续更新

数据结构--顺序表的c语言实现(超详细注释/实验报告)

数据结构学习笔记(数据结构概念顺序表的增删查改等)详细整理

数据结构与算法线性表的链式表示和实现,超详细C语言版

数据结构--单链表的c语言实现(超详细注释/实验报告)