参考书:王道考研数据结构
//函数的声明
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");
}