C语言实现顺序表

顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构,一般情况下采用数组存储

顺序表分为:

  • 静态顺序表(使用地工厂数组存储)
  • 动态顺序表(使用动态开辟的数组存储)

下面实现的是动态顺序表:

  1. C语言中没有这种结构,所以把它们封装成一个结构体,里面有不同类型的元素(数组、有效元素个数、数组总容量),便于管理
typedef int DataType;//给类型取别名 数组元素类型就很好变
typedef struct SeqList
{
   
 DataType *_array;//有效元素(动态开辟的数组)
 int _size;//有效元素个数
 int _capacity;//数组的总容量(空间总大小)
}SeqList,*PSeqList;//定义了结构体变量(把struct SeqList重命名为SeqList)
  1. 对结构体初始化
    数组的大小先设置一个初始值,不够了再扩容
void SeqListInit(PSeqList ps)
{
   
 assert(ps);
 //先设置一个容量(假设可以存放3个元素),在这个基础上再动态开辟
 ps->_array = (DataType*)malloc(sizeof(DataType)* 3);
 if (NULL == ps->_array)
 {
   
  return;
 }
 ps->_capacity = 3;
 ps->_size = 0;
 printf("初始化:  有效元素:%d; 容量:%d\n", ps->_size, ps->_capacity);
}
  1. 容量检测,看是否需要扩容,下面用的是malloc开辟新空间,relloc也可以
void CheckIsCapacity(PSeqList ps)//
{
   
 assert(ps);
 if (ps->_capacity == ps->_size)//容量和大小相等,需要扩容
 {
   
  printf("需要扩容,");
  //每次扩容的大小
  int newcapacity = ps->_capacity * 2;
  //开辟新空间
  DataType *p = (DataType*)malloc(sizeof(DataType)*newcapacity);
  if (p == NULL)
  {
   
   //申请失败
   printf("申请失败\n");
   assert(0);
   return;
  }
  //申请成功,拷贝元素
  printf("申请成功\n");
  memcpy(p, ps->_array, ps->_size*sizeof(DataType));
  //释放旧空间
  free(ps->_array);
  ps->_capacity = newcapacity;
  ps->_array = p;
 }
 else
 {
   
  printf("不需要扩容\n");
 }
}

下来就是对顺序表进行增删改查的操作了

直接看整体代码:

SeqList.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<malloc.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//动态顺序表
typedef int DataType;//给类型取别名 数组元素类型就很好变
typedef struct SeqList
{
   
 DataType *_array;//有效元素
 int _size;//有效元素个数
 int _capacity;//数组的总容量(空间总大小)
}SeqList,*PSeqList;//定义了结构体变量(把struct SeqList重命名为SeqList)

void SeqListInit(PSeqList ps);//初始化顺序表
void SeqListDestory(PSeqList ps);//对顺序表销毁

void CheckIsCapacity(PSeqList ps);//检测是否需要扩容

void SeqListPushBack(PSeqList ps, DataType data);//尾插
void SeqListPopBack(PSeqList ps);//尾删

void SeqListPushFront(PSeqList ps, DataType data);//头插
void SeqListPopFront(PSeqList ps);//头删

void SeqListInsert(PSeqList ps, int pos, DataType data);//任意位置插入  在[0,size)之间
void SeqListErase(PSeqList ps, int pos);//任意位置删除

int SeqListFind(PSeqList ps, DataType data);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值