顺序表结构(就是动态数组)

本文详细介绍了顺序表的概念,它是一种基于动态内存分配的数据结构,类似于数组但具有动态调整大小的能力。内容包括顺序表的创建、插入、删除操作的实现原理,以及在实际编程中的应用和优缺点分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
线性结构:顺序表
     数组结构
     顺序表有两个特性:
          1.顺序表的内存
          2.顺序表的索引(就像数组下标),顺序表就是根据索引去做事情

*/

#include<stdio.h>
#include<stdlib.h>
struct    linerList
{
     char*element;    /*存储char类型的数据为例,因为索引是整形的*/
     int    arrayLength;  /*顺序表的最大长度*/
     int   listSize;     /*顺序表数组容量大小的数字*/
};

/*创建一个顺序表*/
struct   linerList*createList(int   capacity)/*容量*/
{
     /*安全性问题*/
     if(capacity < 1)
     {
           printf("创建顺序表失败!");
           return  NULL;
      }
     struct   linerList* list = (struct    linerList*)malloc(sizeof(struct   linerList));
     /*优先初始化数组最大长度*/
     list->arrayLength = capacity;
     list->element = (char*)malloc(sizeof(list->arrayLength));/*让指针变成数组*/
     list->listSize = 0;
     return  list;
}

/*二维数组的扩充:realloc。一级数组,通过更改一级指针,即传进一个二级指针去修改*/
void   changeArrayCapacity(char**array,int  oldLength,int   newLength)
{
      if(newLength<0)
      {
               printf("数组扩充失败");
               return;
       }
       int   length=oldLength>newLength?oldLength:newLength;
       *array = (char*)realloc(*array,length*sizeof(char));/*数组的重新申请*/
}

/*移动数组元素:拷贝的数组,数组的长度,数组的当前下标*/
void  copyBackWard(char*array,int   arrayNum,int   theIndex)
{
      for(int   i=arrayNum+1;i > theIndex; i--)
      {
            array[i] = array[i-1];
       }
}


/*插入元素*/
void   insertElement(struct    linerList* list, int   theIndex, int  theElement)
/*插入的结构体,插入顺序表的索引,插入的元素是多少*/
{
      /*索引无效:下标小于0,且大于容量大小*/
      if(theIndex<0 || theIndex>list->listSize)
      {
            printf("索引无效!\n");
            return;
       }
       /*2.插入的索引正好等于数组的下标*/
       if(list->listSize == list->arrayLength)
       {
               /*listSize等于数组容量大小的数字,说明数组存储不够,扩充数组,再去储存,调用上面的函数*,以两倍的方式扩充容量*/
               changeArrayCapacity(&list->element,list->arrayLength,2 * list->arrayLength);
               list->arrayLength=2 * list->arrayLength;
        }
        /*3.插入元素。需要把当前索引下的元素移到后面去,在上面写一个函数void  copyBackWard*/
        /*操作的数组,当前总元素个数,插入的序号*/
        copyBackWard(list->element, list->listSize,theIndex);
        list->element[theIndex] = theElement;
        list->listSize++;
}

/*打印的顺序表*/
void   printList(struct     linerList* list)
{
      for(int    i=0;i<list->listSize;i++)
      {
              /*char类型*/
              printf("%c\t", list->element[i]);
       }
       printf("\n");
}

int   main()
{
      struct    linerList*list = createList(2);/*创建一个只能放两个长度的*/
      insertElement(list, 0, 'A');/*在0索引中插入'字符'A*/
      insertElement(list, 0, 'B');
      printList(list);
      
      system("pause");
      return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值