数据结构学习——线性表中动态顺序表的实现(C语言)

#数据结构学习——线性表中动态顺序表的实现(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);
}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DTTTTC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值