#数据结构学习——线性表中动态顺序表的实现(C语言)
#include <stdio.h>
#include <stdlib.h>//调用malloc和free必须库函数
#define maxsize 10
//typedef double data;通过typedef来实现定义表中的数据类型
typedef struct //定义顺序表有两种一个是静态的一个是动态的静态的在注释中定义
{ //动态分配中要定义一个指示动态分配指针
int *data;
int maxsie; //表示表的最大容量是多少
int length; //当前长度
//动态申请或释放内存空间malloc,free函数
//l.data=(Elemtype *)malloc(sizeof(Elemtype)*Initsize);Initsize为函数参数指明要多大的存储空间(我觉得是多少个)
// ⬆️的指针类型强制转换成定义的数据类型
/*静态ElemType data[maxsize];其中elemtype为任意定义的数据类型,数组为模拟线性表
int length;*/
}sequenceList;
//初始化顺序表ß
void Initlist(sequenceList &l)
{
l.data=(int *)malloc((sizeof(sequenceList)*maxsize));
/*for (int i = 0; i < l.maxsie; i++)
{
l.data[i]=0;
}*/
//若不用for遍历置0会在内存中有遗留脏数据(可以省略因为通过最大长度访问表结构是“非法的”,循环条件是i<l.lengh不可能超过表长)
l.length=0;//因为有脏数据的原因所以将长度置0的操作一定不可以省略
}
//动态增加表的长度
void Increase(sequenceList &l,int lenght)
{
l.data=(int *)malloc((l.maxsie+lenght)*sizeof(sequenceList));
int *p=l.data;
for (int i = 0; i < l.length; i++)//将原来数据复制到新的区域
{
l.data[i]=p[i];
}
l.maxsie=l.maxsie+lenght;//表的长度增加
free(p);//释放原来的内存
}
//顺序表的插入
void ListInsert(sequenceList &l,int i,int v)
{
if (i<1||i>l.length+1)
{
printf("参数不合法");
exit(1);
}
if (l.length>=l.maxsie)//判断是否表中的数据满了
{//满了就调用增加动态表长度函数
Increase(l,10);
ListInsert(l,i,v);
}else{
for (int j = l.length;j>=i;j--)
{
l.data[j]=l.data[j-1];//最后的元素往前移在把前一个元素往后移
}
l.data[i-1]=v;
l.length++;
}
}
void ListAdd(sequenceList &l,int v)
{
if (l.length<=l.maxsie)
{
l.data[l.length]=v;
l.length++;
}
}
//顺序表的删除
void ListDelete(sequenceList &l,int i,int &e){
if (i<1||i>l.length){
printf("参数异常");
}else{
e=l.data[i-1];
for (int j = i; j < l.length; j++)
{
l.data[j-1]=l.data[j];//先把前一个元素往前移再把后一个元素往前移
}
l.length--;
}
}
//顺序表的按位查找
int GetElem(sequenceList &l,int i){
return l.data[i-1];
}
//顺序表的按值查找
int LocateElem(sequenceList &l,int i){
for (int j = 0; j <=l.length; j++)
{
if (l.data[j]==i)
{
return j+1;//j表示数组下标而表的位序要加1
}
}
return -1;
}
int main()
{
sequenceList l;
Initlist(l);
ListAdd(l,1);
ListAdd(l,2);
ListAdd(l,3);
ListAdd(l,4);
ListAdd(l,5);
//删除测试
// int e;
// ListDelete(l,4,e);
// printf("删除的是%d\n",e);
ListInsert(l,3,10);
//插入测试
// for (int i = 0; i < l.length; i++)
// {
// printf("%d",l.data[i]);
// printf(" ");
// }
//按值查询测试
int a=LocateElem(l,11);
if (a==-1)
{
printf("没有查到");
}else
{
printf("%d",a);
}
}