#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50 //线性表的存储区的总长度
typedef struct
{
int *data; //指向数据区地址,假设存储int型
int size; //当前顺序表的长度
}SqList;
void Initialise(SqList *List) //初始化顺序表
{
List->data=(int *)malloc(sizeof(int)*MAXSIZE); //为顺序表申请空间
List->size=0;
printf("---------申请空间结束");
}
void DelList(SqList *List) //释放顺序表
{
free(List->data); //free释放了data指针指向的内存块,告诉系统该块内存闲置,但date仍然指向该内存块首地址,故需赋值为NULL;
List->data=NULL;
List->size=0;
printf("\n删除成功");
}
int JudEmpty(SqList *List) //判断顺序表书否为空
{
if(List->size==0)
return 1;
else
return -1;
}
int Length(SqList *List) //求顺序表表长
{
int size=0;
for(int i=0;List->data[i]!=NULL;i++)
size++;
return size;
}
void Output(SqList *List) //输出顺序表
{
for(int i=0;i<List->size;i++)
{
printf("\n第%d个数据是: %d",i,List->data[i]);
}
printf("\n---------输出结束。");
}
void Insert(SqList *List,int l,int data) //插入
{
if(l<1||l>List->size+1||l>=MAXSIZE) //判断插入位置是否合法,需要在第一个元素到最后一个元素的后一位之间,且不能超过最大长度
{
printf("illgal location");
return -1;
}
for(int i=List->size;i>l-1;i--)
{
List->data[i]=List->data[i-1]; //所有元素后移一位
}
List->data[l-1]=data; //插入data在l的位置(下标是l-1)
List->size++;
printf("\n插入位置: %d\n---------插入结束",l);
}
int Loc_Search(SqList *List,int l) //按位查找
{
if(l<=0||l>List->size)
return -1;
return List->data[l-1];
}
int Val_Search(SqList *List,int value) //按值查找
{
for(int i=0;i<List->size;i++)
if(List->data[i]==value)
return i+1;
return -1;
}
int Loc_Delete(SqList *List,int l,int *e) //按位删除元素并记录删除的元素在e
{
if(l<=0||l>List->size)
return -1;
*e=List->data[l-1];
for(int i=l;i<List->size;i++) //若表长为1则不进入for循环,跳到表长减一算作删除了第0号元素
List->data[i-1]=List->data[i];
List->size--; //最后一个未覆盖的数据因表长减一算作删除;
return 1;
}
int Val_Delete(SqList *List,int value) //按值删除元素并返回删除元素的位置
{
if(JudEmpty(List)==1) //判空,这里由于Jud函数不会返回0所以用判别式
{
return -1;
}
for(int i=0;i<List->size;i++)
if(List->data[i]==value)
return i+1;
return -2;
}
int main()
{
SqList test;int e;
Initialise(&test);
printf("\n是否为空:%d",JudEmpty(&test));
Insert(&test,1,1);
Insert(&test,2,2);
printf("\n是否为空:%d",JudEmpty(&test));
printf("\n顺序表长: %d",Length(&test));
Output(&test);
int c=Loc_Search(&test,0);
printf("\n按位查找: %d",c);
int b=Loc_Search(&test,1);
printf("\n按位查找: %d",b);
Loc_Delete(&test,2,&e);
printf("\n删除的值为:%d",e);
int a=Val_Search(&test,2);
printf("\n按值查找: %d",a);
printf("\n按值删除:%d",Val_Delete(&test,1));
DelList(&test);
return 0;
}
线性表之顺序表的十大操作(从初始化到释放)C语言版
最新推荐文章于 2022-08-01 18:19:25 发布