数据结构-顺序表基本操作(C语言实现)

参考书:王道考研数据结构

//函数的声明
SqList InitList(l);                                    //初始化一个顺序表
void PrintfList(SqList l);                             //输出表
int GetElem(SqList l,int i);                           //按位查找
int LocateElem(SqList l,int e);                        //按值查找
int Length(SqList l);                                  //求表长
int Empty(SqList l);                                   //判空
SqList change_data(SqList l,int old_data,int new_data);//替换old_data为新元素new_data
SqList change_weizhi(SqList l,int pos,int  n_elem);    //按pos位置替换为n_elem的值
SqList ListInsert(SqList l,int q,int e);               //在pos位置新插入数据e
SqList ListDelete(SqList l,int pos);                   //删除pos位置上的数据
void DestroyList(SqList l);                            //销毁表

代码:

#include <stdio.h>
#include <stdlib.h>

#define Size 5

//顺序表的结构定义
typedef struct{
	int *data;     //定义一个动态数组data
	int size;      //顺序表存储容量
	int length;    //顺序表长度
}SqList;

//函数的声明
SqList InitList(l);                                    //初始化一个顺序表
void PrintfList(SqList l);                             //输出表
int GetElem(SqList l,int i);                           //按位查找
int LocateElem(SqList l,int e);                        //按值查找
int Length(SqList l);                                  //求表长
int Empty(SqList l);                                   //判空
SqList change_data(SqList l,int old_data,int new_data);//替换old_data为新元素new_data
SqList change_weizhi(SqList l,int pos,int  n_elem);    //按pos位置替换为n_elem的值
SqList ListInsert(SqList l,int q,int e);               //在pos位置新插入数据e
SqList ListDelete(SqList l,int pos);                   //删除pos位置上的数据
void DestroyList(SqList l);                            //销毁表


/*用于初始化顺序表*/
int list[Size]={5,2,1,13,14};


/******************************************************************
**函数:main主函数
**返回值:无
**参数:void
*******************************************************************/
int main(){
	/*初始化顺序表基本数据*/
	SqList l;                  //初始化顺序表
	int pos=0;                 //初始化位置
	int Locate_elem=13;        //初始化查找值为13
	
	
	/*创建一个顺序表*/
	l=InitList();                   //调用函数InitList创建一个顺序表l
	printf("创建的顺序表为:\n");
	PrintfList(l);                  //调用函数PrintfList输出l表
	printf("-------------------------------------------------------------------------\n");
	
	
	
	/*按位查找*/
	
	printf("按位查找第三个位置的元素为\n%d\n\n",GetElem(l,3));
	
	printf("-------------------------------------------------------------------------\n");
	
	/*按值查找*/
	printf("按值查找查找值为1的元素的位置是\n%d\n\n",LocateElem(l,1));
	printf("-------------------------------------------------------------------------\n");
	
	/*把旧元素的值修改为新元素的值*/
	l = change_data(l,5,100);
	printf("将5改为100得到新的顺序表为\n");
	PrintfList(l);                  //调用函数PrintfList输出l表
	printf("-------------------------------------------------------------------------\n");
	
	
	/*将changge_pos位置上的值修改*/
	l = change_weizhi(l,2,520);
	printf("将2号位置上的值改为520得到新的顺序表为\n");
	PrintfList(l);                  //调用函数PrintfList输出l表
	printf("-------------------------------------------------------------------------\n");
	
	
	/*判空*/
	Empty(l);
	printf("\n\n");
	printf("-------------------------------------------------------------------------\n");
	
	/*在2位置后插入一个新元素e*/
	l = ListInsert(l,2,99);
	printf("将2号位置后插入一个新元素99得到新的顺序表为\n");
	PrintfList(l);         
	printf("\n\n");
	printf("-------------------------------------------------------------------------\n");
	
	
	/* 删除pos位置上的数据*/
	l = ListDelete(l,2); 
	printf("将6号位置后的元素删除得到新的顺序表为\n");
	PrintfList(l);         
	printf("\n\n");
	printf("-------------------------------------------------------------------------\n");

	/*销毁顺序表*/
	printf("\n销毁顺序表");
	DestroyList(l);  
}




/*调用函数*/


/******************************************************************
**函数:创建顺序表
**返回值:创建成功的顺序表l
**参数:void
*******************************************************************/
SqList InitList(void)
{
	SqList l;                                   //初始化l
	int i;                                      //i为for循环的计数器
	
	l.data=(int*)malloc(Size*sizeof(int));      //动态申请空间
	if(!l.data)                                 //判断申请是否成功
	{
		printf("申请内存失败!\n");
		exit(0);      //失败则推出
	}
	for(i=0;i<Size;i++)       //用循环将l初始化为Size大小的顺序表
	{
		l.data[i]=list[i];    //循环将list数组的值赋值给l
	}
	l.length=Size;        //l的长度等于SIZE
	l.size=Size;          //l的存储大小等于SIZE
	
	return l;
}



/******************************************************************
**函数:打印输出顺序表
**参数:l
**返回:顺序表顺序输出
*******************************************************************/
void PrintfList(SqList l)
{
	int i;    //循环计数器
	for(i=0;i<l.length;i++)          //循环遍历整个动态数组并输出
	{
		printf("%d ",l.data[i]);     //输出
	}
	printf("(表长为%d)",l.length);
	printf("(表的存储长度为%d)\n\n",l.size);
}


/******************************************************************
**函数:按位查找
**参数:l,i
**返回:l的数组下标为i-1的值
*******************************************************************/
int GetElem(SqList l,int i)
{
	return l.data[i-1];
}


/******************************************************************
**函数:按值查找
**参数:l,e
**返回:l数组中元素值为e元素的数组下标+1
*******************************************************************/
int LocateElem(SqList l,int e)
{
	int i;
	for(i=0;i<l.length;++i)
	{
		if(l.data[i]==e){
			return i+1;
		}
		
	}
}


/******************************************************************
**函数:按值查找后修改值
**参数:l,old_data,new_data
**返回:修改后的l数组
*******************************************************************/
SqList change_data(SqList l,int old_data,int new_data)
{
	
	int old_data_pos=LocateElem(l,old_data);
	l.data[old_data_pos-1]=new_data;
	return l;
	
}

/******************************************************************
**函数:按位置查找后修改值
**参数:l,pos,n_elem
**返回:修改后的l数组
*******************************************************************/
SqList change_weizhi(SqList l,int pos,int  n_elem)
{
	l.data[pos-1]=n_elem;
	return l;
	
}

/******************************************************************
**函数:判空
**参数:l
**返回:0或1
*******************************************************************/
int Empty(SqList l)
{
	if(l.size==0){
		printf("该顺序表为空");
	}else{
		printf("该顺序表不为空");
	}
}


/******************************************************************
**函数:在q位置后插入元素e
**参数:l,q,e
**返回:修改后的数组
*******************************************************************/
SqList ListInsert(SqList l,int q,int e){
	int i;

	if(q<0||q>l.length+1){
		printf("没有该位置,无效");
	}
	if(l.length>=l.size){
		l.data = (int *)realloc(l.data,(l.size+1)*sizeof(int));
		if(!l.data){
			printf("动态内存申请失败\n");
			exit(0);
		}
		l.size+=1;
	}
	l.length+=1;
	
	for(i=l.length-1;i>=q-1;i--)
	{
		l.data[i+1]=l.data[i];
	}
	l.data[q-1]=e;
	
	return l;
	
} 


/******************************************************************
**函数:删除pos位置的元素
**参数:l,pos
**返回:修改后的数组
*******************************************************************/
SqList ListDelete(SqList l,int pos)
{
	int i;
	if(pos<1||pos>l.length)
	{
		printf("没有该元素");
	}
	for(i=pos;i<l.length;i++){
		l.data[i-1]=l.data[i];
	}
	l.length--;
	return l;

}


/******************************************************************
**函数:销毁顺序表
**参数:l
**返回:成功or失败
*******************************************************************/

void DestroyList(SqList l)
{
	free(l.data);
	l.data = NULL;
	printf("\n销毁成功\n");
}

猜你喜欢

转载自blog.csdn.net/weixin_44449779/article/details/121142585