菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
87
0

顺序表

原创
05/13 14:22
阅读数 36858

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,

一般采用数组存储.分为静态顺序表,动态顺序表

//顺序表的静态存储,空间不可变
#define N 100
typedef int SLDataType;/*数据类型的别名*/

typedef struct SeqList
{
    SLDataType arr[N];/*定长数组*/
    size_t size;/*有效元素个数*/
}; SeqList
//顺序表的动态存储,空间可变
typedef int SLDataType;/*数据类型的别名*/

typedef struct SeqList
{
    SLDataType* _data;/*需要动态开辟的数组*/
    size_t size;/*有效元素个数*/
    size_t _capacity;/*容量,当前可以存放的最大元素个数*/
}; SeqList

我们主要使用动态顺序表,静态基本不用

下面看看头插头删尾插尾删

#include<stdio.h>
#include<stdlib.h>
#include<cstring>

typedef int SLDataType;

typedef struct SeqList
{
    SLDataType* _data;/*需要动态开辟的数组*/
    size_t _size;/*有效元素个数*/
    size_t _capacity;/*容量,当前可以存放的最大元素个数*/
} seqList;

void initSeqList(seqList* sl){
    sl->_data = NULL;
    sl->_size = sl->_capacity = 0;
}
//尾插一个数据
void checkCapacity(seqList* sl){
    //检查是否为空指针
    if (sl == NULL)
        return;
    //如果元素个数和容量相同,说明空间满了,需要扩容
    if (sl->_size == sl->_capacity){
        int newCapacity = sl->_capacity == 0 ? 1 : 2*sl->_capacity;
        //开一个更大的空间,拷贝原数据,释放原空间
        SLDataType* tmp = (SLDataType*)malloc(sizeof(SLDataType)* newCapacity);
        //内存拷贝
        memcpy(tmp, sl->_data, sizeof(SLDataType)* sl->_size);
     //释放原来空间
        free(sl->_data);
    //更新
        sl->_data = tmp;
        sl->_capacity = newCapacity;
    }
}
void pushBack(seqList* sl, SLDataType val){
    //检查容量
    checkCapacity(sl);
    sl->_data[sl->_size] = val;
    ++sl->_size;
}
void printSeqList(seqList*sl)
{
    for (int i = 0; i < sl->_size; ++i){
        printf("%d ", sl->_data[i]);
    }
    printf("\n");
}

//尾删一个数据
void popBack(seqList* sl){
    if (sl == NULL)
        return;
    if (sl->_size > 0)
        sl->_size--;
}
//头插:给顺序表第一个位置插入元素
//一般不进行头插,效率低
void pushFront(seqList* sl, SLDataType val){
    if (sl == NULL)
        return;
    //0.检查容量
    checkCapacity(sl);
    //1.移动元素,从后向前移动,以免覆盖元素
    int end = sl->_size;
    while (end > 0){
        sl->_data[end] = sl->_data[end - 1];
        --end;
    }
    //2.头插
    sl->_data[0] = val;
    sl->_size++;
}

//头删
void popFront(seqList* sl){
    if (sl == NULL || sl->_size==0)
        return;
    int start = 1;/*起始位置*/
    while (start < sl->_size){
        /*从前往后移动*/
        sl->_data[start - 1] = sl->_data[start];
        ++start;
    }
    --sl->_size;
}

void test (){
    seqList sl;
    initSeqList(&sl);
    pushBack(&sl, 1);
    pushBack(&sl, 2);
    pushBack(&sl, 3); 
    pushBack(&sl, 4);
    pushBack(&sl, 5);
    printSeqList(&sl);
    popBack(&sl);
    printSeqList(&sl);
    popBack(&sl);
    printSeqList(&sl);
    popBack(&sl);
    printSeqList(&sl);
    popBack(&sl);
    printSeqList(&sl);
    popBack(&sl);
    printSeqList(&sl);
    pushBack(&sl, 6);
    printSeqList(&sl);
    pushFront(&sl, 0);
    pushFront(&sl, -1);
    pushFront(&sl, -2);
    pushFront(&sl, -3);
    printSeqList(&sl);
    popFront(&sl);
    printSeqList(&sl);
    popFront(&sl);
    printSeqList(&sl);
    popFront(&sl);
    printSeqList(&sl);
    popFront(&sl);
    printSeqList(&sl);
    popFront(&sl);
    printSeqList(&sl);
}

int main(){
    test();
    system("pause");
    return 0;
}

 

发表评论

0/200
87 点赞
0 评论
收藏