C语言学习网

C语言的顺序表怎么实现

发表于:2022-08-12 作者:安全数据网编辑
编辑最后更新 2022年08月12日,本文小编为大家详细介绍"C语言的顺序表怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"C语言的顺序表怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.线性表

本文小编为大家详细介绍"C语言的顺序表怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"C语言的顺序表怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

2.1概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可分为:

1.静态顺序表:使用定长数组存储。

2.动态顺序表:使用动态开辟的数组存储。

//顺序表的静态存储 #define N 100struct SeqList{        int a[N];//定长存储        int size;//有效数据的个数};
//顺序表的动态存储typedef struct SeqList{        SeqDataType* a;//指向动态开辟的数组        int size;    //有效数据个数        int capacity; //容量}SeqList;

顺序表本质上是数组,在数组上增加了两个要求:

1.插入数据的过程中,可以动态增长

2.并且要求里面存储的数据必须是从左往右,是连续的

顺序表的缺陷

1.动态增容有性能消耗

2.头部插入数据时,需要挪动数据

2.2 提供接口

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们来实现动态顺序表。

首先在头文件中提供接口:

typedef int SeqDataType; //需要插入什么类型的数据,就改成对应类型typedef struct SeqList{        SeqDataType* a;//指向动态开辟的数组        int size;    //有效数据个数        int capacity; //容量}SeqList;//内存中管理数据结构 提供增删查改的接口//顺序表初始化void SeqListInit(SeqList* pq);//顺序表销毁void SeqListDestory(SeqList* pq);//顺序表打印void SeqListPrint(SeqList* pq);//打印数组//检查空间,如果满了,进行增容void SeqCheckCapacity(SeqList* pq)//顺序表尾插void SeqListPushBack(SeqList* pq, SeqDataType x);//顺序表头插void SeqListPushFront(SeqList* pq, SeqDataType x);//顺序表尾删void SeqListPopBack(SeqList* pq);//顺序表头删void SeqListPopFront(SeqList* pq);//顺序表查找xint SeqListFind(SeqList* pq, SeqDataType x);//查找 查到返回下标,没查到返回-1//顺序表在指定位置插入数据void SeqListInsert(SeqList* pq, int pos, SeqDataType x);//在下标pos位置处插入数据//顺序表在指定位置删除数据void SeqListErase(SeqList* pq, int pos);//把下标为pos位置处的数据删除//顺序表在指定位置替换数据void SeqListModify(SeqList* pq, int pos, SeqDataType x);//把小标为pos位置的值改为x

2.3 接口实现

在源文件SeqList.c中实现接口功能

(1)顺序表初始化

void SeqListInit(SeqList* pq){        assert(pq != NULL);//或者 assert(pq); 断言 防止传入空指针        pq->a = NULL;        pq->size = 0;        pq->capacity = 0;}

(2)顺序表销毁

void SeqListDestory(SeqList* pq){        assert(pq);        free(pq->a);        pq->a = NULL;        pq->size = 0;        pq->capacity = 0;}

(3)顺序表打印

void SeqListPrint(SeqList* pq){        assert(pq);        for (int i = 0; i < pq->size; ++i)        {                printf("%d ", pq->a[i]);        }        printf("\n");}

(4)检查空间,如果满了,进行增容

//检查是否需要扩容void SeqCheckCapacity(SeqList* pq){        //满了,需要增容        if (pq->size == pq->capacity)        {                int newcapacity = (pq->capacity == 0 ? 4 : pq->capacity * 2);                //realloc接收的地址如果为空,将像malloc一样,开辟一块新空间                SeqDataType* newA = realloc(pq->a, sizeof(SeqDataType) * newcapacity);//realloc返回 开辟的新空间的地址                if (newA == NULL)                {                        printf("realloc fail\n");                        exit(-1);//失败了就退出                }                pq->a = newA;                pq->capacity = newcapacity;        }}

(5)顺序表尾插

void SeqListPushBack(SeqList* pq, SeqDataType x)//尾插{        assert(pq);        SeqCheckCapacity(pq);        pq->a[pq->size] = x;        pq->size++;}

(6)顺序表头插

void SeqListPushFront(SeqList* pq, SeqDataType x){        assert(pq);        SeqCheckCapacity(pq);        int end = pq->size - 1;        while (end >= 0)        {                pq->a[end + 1] = pq->a[end];                end--;        }        pq->a[0] = x;        pq->size++;}

(7)顺序表尾删

void SeqListPopBack(SeqList* pq){        assert(pq);        assert(pq->size > 0);        pq->size--;}

(8)顺序表头删

void SeqListPopFront(SeqList* pq){        assert(pq);        assert(pq->size > 0);        int begin = 0;        while (begin < pq->size - 1)        {                pq->a[begin] = pq->a[begin + 1];                begin++;        }        pq->size--;}

(9)顺序表查找x

int SeqListFind(SeqList* pq, SeqDataType x){        assert(pq);        for (int i = 0; i < pq->size; ++i)        {                if (pq->a[i] == x)                {                        return x;                }        }        return -1;//没找到}

(10)顺序表在指定位置插入数据

void SeqListInsert(SeqList* pq, int pos, SeqDataType x){assert(pq);assert(pos >= 0 && pos < pq->size);SeqCheckCapacity(pq);//检查是否需要扩容int end = pq->size - 1;while (end >= pos){pq->a[end + 1] = pq->a[end];end--;}pq->a[pos] = x;pq->size++;}void SeqListInsert(SeqList* pq, int pos, SeqDataType x){        assert(pq);        assert(pos >= 0 && pos < pq->size);        SeqCheckCapacity(pq);//检查是否需要扩容        int end = pq->size - 1;        while (end >= pos)        {                pq->a[end + 1] = pq->a[end];                end--;        }        pq->a[pos] = x;        pq->size++;}

(11)顺序表在指定位置删除数据

void SeqListErase(SeqList* pq, int pos){        assert(pq);        assert(pos >= 0 && pos < pq->size);        int begin = pos;        while (begin <= pq->size - 1)        {                pq->a[begin] = pq->a[begin + 1];                begin++;        }        pq->size--;}

(12)顺序表在指定位置替换数据

void SeqListModify(SeqList* pq, int pos, SeqDataType x){        assert(pq);        assert(pos >= 0 && pos < pq->size);        pq->a[pos] = x;}

读到这里,这篇"C语言的顺序表怎么实现"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0