数据结构——顺序表中基本操作的实现

  • CreateList(SqList &L,int n) :创建长度为n的顺序表L—— 时间复杂度:O(n)
  • InitList(SqList &L) :初始化顺序表L——时间复杂度:O(1)
  • InsertList(SqList &L,int i,ElemType e) :在位置i处插入元素e ——时间复杂度:O(n)
  • ListDelete(SqList &L,int i):删除位置i处元素——时间复杂度:O(n)
  • LocateElem(SqList L,ElemType e) :返回顺序表L中第一个等于e的元素的位置——时间复杂度:O(n)
  • GetElem(SqList L, int i, ElemType &e):根据指定的位置序号i,获取顺序表L中第i个数据元素的值——时间复杂度:O(1)
  • Reverse(SqList &L) : 将原顺序表L直接倒置。
  • PrintList(SqList L):遍历顺序表L,并输出。
     

完整的实现代码(包括算法步骤和代码注释)

//******************************数据结构-顺序表中基本操作的实现******************************// 
#include<stdio.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//------顺序表的存储结构------//
#define MAXSIZE 100     //顺序表可能达到的最大长度
typedef struct
{
	ElemType *elem; //或ElemType elem[MAXSIZE]  存储空间的基地址  
	int length;	 //当前长度 
}SqList;         //顺序表的结构类型为SqList 


//------顺序表的初始化------//
 //-----【算法步骤】 -----// 
  //1.为顺序表 L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
  //2.将表的当前长度设为0。
bool InitList(SqList &L)
{
	//构造一个空的顺序表L
	L.elem=new int[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间 
	if(!L.elem)	return false;   //存储分配失败退出 
	L.length=0;                 //空表长度为0 
	return true; 
}

//------顺序表初始化前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.elem[i]);
		L.length++;
	} 
	return true;
}

//------顺序表的插入------//
 //-----【算法步骤】 -----// 
  //1.判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回ERROR。 
  //2.判断顺序表的存储空间是否已满,若满则返回ERROR。
  //3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。 
  //4.将要插入的新元素e放入到第i个位置。 
  //5.表长加1。
Status ListInsert(SqList &L, int i, int e) 
{
	//在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1 
	if(i<1||(i>L.length+1)) return ERROR; //i值不合法 
	if(L.length==MAXSIZE) return ERROR; //当前存储空间已满 
	for(int j=L.length-1; j>=i-1; j--)
		L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移 
	L.elem[i-1]=e; //将新元素e放入第i个位置 
	++L.length; //表长加1 
	return OK; 
}

//------顺序表的删除------//
 //-----【算法步骤】 -----// 
  //1.判断删除位置i是否合法(i值的合法范围是1<=i<=n),若不合法则返回ERROR。 
  //2.将第i+1个至第n个的元素依次向前移动一个位置(i=n时无需移动)。 
  //3.表长减1。
Status ListDelete(SqList &L,int i) 
{
	//在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
	if(i<1||(i>L.length)) return ERROR; //i值不合法 
	for(int j=i; j<=L.length-1; j++)
		L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移 
	--L.length; //表长减1 
	return OK; 
}


//------顺序表的查找(按值查找)------//
 //-----【算法步骤】 -----// 
  //1.从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。 
  //2.若查遍整个顺序表都没有找到,则查找失败,返回0。 
  
int LocateElem(SqList L, int e) 
{
	//在顺序表L中查找值为e的数据元素,返回其序号。
	for(int i=0; i<L.length;i++)
		if(L.elem[i]==e) return i+1;  //查找成功,返回序号i+1。
	return 0;                         //查找失败,返回0。 
}

//------顺序表L的倒置------//
void ReverseList(SqList &L)
{
	//顺序表L的逆置 
	for(int i=0;i<L.length/2;i++)  //
	{
		//交换数据 
		int temp=L.elem[i];
		L.elem[i]=L.elem[L.length-1-i];
		L.elem[L.length-1-i]=temp;	
	}
  }  


//------输出打印顺序表  按位置从小到大输出顺序表所有元素------//
void PrintList(SqList L)
{
	printf("当前顺序表中所有元素为:");
	for(int i=0; i<L.length; i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
 } 
 
//------创建顺序表函数------//
void Create(SqList &L) 
{
	int n;
	bool flag;
	L.length=0;
	printf("请输入要创建的顺序表的长度:");
	scanf("%d",&n);
	printf("请输入依次输入%d个数(空格隔开):",n);
	flag=CreateList(L,n);
	if(flag){
		printf("顺序表L创建成功!\n");
		PrintList(L);
	}
	else
		printf("输入长度不合法!\n"); 
}

//------插入顺序表函数------//
void Insert(SqList &L)
{
	int place;
	int e;
	bool flag;
	printf("请输入要插入的位置(从1开始)及元素:");
	scanf("%d%d",&place,&e);
	flag=ListInsert(L,place,e);
	if(flag)
	{
		printf("插入成功!\n");
		PrintList(L);
	 } 
 } 

//------删除顺序表函数------//
void Delete(SqList &L)
{
	int place;
	bool flag;
	printf("请输入要删除的位置(从1开始):");
	scanf("%d",&place);
	flag=ListDelete(L,place);
	if(flag)
	{
		printf("删除成功!\n");
		PrintList(L);
	}
}


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

//------倒置顺序表函数------//
void Reverse(SqList L)
{    
	ReverseList(L);
	printf("顺序表L倒置后为:");
	for(int i=0; i<L.length; i++)
	{
		printf("%d ",L.elem[i]);
	}
}

//菜单
void Menu()
{
	printf("\n|*|----------  1.创建顺序表L中的数据元素  ----------|*|\n");
	printf("|*|----------  2.在顺序表L中插入数据元素  ----------|*|\n");
	printf("|*|----------  3.在顺序表L中删除数据元素  ----------|*|\n");
	printf("|*|----------  4.查找顺序表L中的数据元素  ----------|*|\n");
	printf("|*|----------  5.倒置顺序表L中的数据元素  ----------|*|\n");
	printf("|*|----------  6.打印顺序表L中的数据元素  ----------|*|\n");
	printf("|*|----------  7.退出程序  ----------|*|\n");
	
 } 
//------创建主函数------//
int main()
{
	SqList L;
	int choice; 
	InitList(L);
	while(1)
	{
		Menu();
		printf("请输入菜单序号:");
		scanf("%d",&choice);
		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;
		}
		if(choice==7) break; 
	}
}

运行结果:

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:1
请输入要创建的顺序表的长度:3
请输入依次输入3个数(空格隔开):1 2 3
顺序表L创建成功!
当前顺序表中所有元素为:1 2 3

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:2
请输入要插入的位置(从1开始)及元素:2 4
插入成功!
当前顺序表中所有元素为:1 4 2 3

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:3
请输入要删除的位置(从1开始):4
删除成功!
当前顺序表中所有元素为:1 4 2

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:4
请输入要查找的值:4
该元素的位置为:2
查找成功!

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:5
顺序表L倒置后为:2 4 1
|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:6
当前顺序表中所有元素为:2 4 1

|*|----------  1.创建顺序表L中的数据元素  ----------|*|
|*|----------  2.在顺序表L中插入数据元素  ----------|*|
|*|----------  3.在顺序表L中删除数据元素  ----------|*|
|*|----------  4.查找顺序表L中的数据元素  ----------|*|
|*|----------  5.倒置顺序表L中的数据元素  ----------|*|
|*|----------  6.打印顺序表L中的数据元素  ----------|*|
|*|----------  7.退出程序  ----------|*|
请输入菜单序号:7

--------------------------------
Process exited after 58.64 seconds with return value 0
请按任意键继续. . .

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值