顺序表的实现静态分配

#include<stdio.h>


//顺序表类型定义(静态分配)
#define MaxSize 5              //定义顺序表的最大长度
typedef struct
{
	int data[MaxSize];          //使用静态的数组存放数据元素,元素类型为整形,MaxSize*sizeof(int)
	int length;                 //顺序表当前的长度,分配一个int字节的空间
}SqList;                        //Sq--sequence,顺序的意思

//因为定义了类型名为SqList,那么定义一个顺序表的时候就不需要使用struct,使用SqList即可



//对顺序表进行的基本操作
void InitList(SqList &L);                    //初始化一个顺序表,对length设置初值,构造空表
int GetLength(SqList L);                     //求表的长度
bool Empty(SqList L);                        //判空操作
void PrintList(SqList L);                    //输出顺序表
bool ListInsert(SqList &L,int i,int e);      //按位序插入,在第i个位置上插入元素e,返回bool值方便别人判断是否插入成功,是否获取返回值,按具体情况而定
bool ListDelete(SqList &L,int i,int &e);     //按位序删除
int GetElem(SqList L,int i);                 //按位序查找
int LocateElem(SqList L,int e);              //按值查找

//由于没有使用动态分配内存的方式(malloc),所以并没有DestroyList(&L)函数,在程序结束后会自动销毁该数组





//基本方法(函数)的实现
//初始化一个顺序表,因为是直接对已经定义的表(原表)进行操作,所以是引用&
void InitList(SqList &L)       
{
	L.length=0;                //初始的顺序表长度为0,构造一个空的顺序表
}




int GetLength(SqList L)
{
	return L.length;
}




bool Empty(SqList L)
{
	return(L.length==0);
}




void PrintList(SqList L)                 //这属于违规打印,比如只有第三个位置我插入了元素,其余位置仍然没有值,那么就是计算机本身内存空间存放的那个值了
{
	//使用MaxSize会导致删除操作之后,输出的个数仍然为Maxsize,输出的数据可能就是之前存放的数据了;
	for(int i=0;i<L.length;i++)           //L.length其实也不合法,因为比如上面插入一个元素在第三个位置,我打印出来的是第一个位置的值
		printf("%d ",L.data[i]);
	printf("\n");
}




bool ListInsert(SqList &L,int i,int e)      //第i个位置(包括第i个)开始,所有元素后移一位
{
	if(i<0||i>L.length+1)                      //判断位序值是否合法
		return false;                       
	if(L.length>=MaxSize)                   //判断顺序表是否满了
		return false;

	for(int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1];              //注意数组下标为i-1,位序为i
	L.data[i-1]=e;
	L.length++;                             //插入一个元素后,顺序表的当前长度加一,注意不是分配的空间加一
    
	return true;
}



bool  ListDelete(SqList &L,int i,int &e)
{
	if(i<0||i>L.length)
		return false;
	if(L.length==0)
		return false;
    e=L.data[i-1];                         //先将即将删除的元素返回
	for(int j=i;j<L.length;j++)            //将第i个位置后的元素前移
		L.data[j-1]=L.data[j];
	L.length--;

	return true;
}




int GetElem(SqList L,int i)
{
	return L.data[i-1];
}

int LocateElem(SqList L,int e)
{
	for(int i=0;i<L.length;i++)
	{
		if(L.data[i]==e)
			return i+1;
	}
}



void main()
{
	SqList L;                  //定义一个顺序表
	InitList(L);
	for(int i=0;i<MaxSize;i++)
		ListInsert(L,i+1,i);

	if(Empty(L)==false)
		printf("该顺序表不是空表\n");
	else
		printf("该顺序表是空表\n");
    
	int e=-1;
	if(ListDelete(L,2,e))
	{
		printf("已经删除第2个元素,删除的元素值=%d\n",e);
	}
	else
		printf("位序不合法或者顺序表为空,删除失败\n");
	printf("顺序表的长度=%d\n",GetLength(L));
	
    PrintList(L);


	printf("第3个元素的值=%d\n",GetElem(L,3));
	printf("元素值为2的数其位序为:%d\n",LocateElem(L,2));

}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值