数据结构线性表之不定长顺序表

我们上次说到了定长顺序表,这次来说说不定长的,我们还是先来引用一下数据结构C语言(严蔚敏)课本上的讲解。
数据结构线性表之不定长顺序表_第1张图片

我们可以看到不定长顺序表增加了一个Listsize,课本上说指顺序表当前分配的存储空间大小,用白话来说就是它这个顺序表有多少个格子*sizeof(格子基类型)得出的大小,不定长顺序表因为要扩大表容,所以我们采用动态开辟顺序表的方法实现,它的逻辑地址和定长顺序表是一样的。
我们还是定义三个文件,两个.cpp,一个.h
先来写desqlit.h

#pragma once
//不定长顺序表

#define INITSIZE 10

typedef struct DSeqList
{
    int *elem;//保存动态创建存放数据内存的地址
    int length;//有效数据个数
    int listsize;//总单元个数(总格子数)
}DSeqList,*PDSeqList;//12

void InitSeqList(PDSeqList ps);

bool Insert(PDSeqList ps,int pos,int val);

bool DeletePos(PDSeqList ps,int pos);

int Search(PDSeqList ps,int key);

bool DeleteVal(PDSeqList ps,int key);

bool IsEmpty(PDSeqList ps);

//获取有效数据个数
int GetLength(PDSeqList ps);

//销毁顺序表
void  Destroy(PDSeqList ps);

//清空数据
void Clear(PDSeqList ps);

void Show(PDSeqList ps);

大家发现了,和定常顺序表定义的函数是一样的
下面我们来写desqlist.cpp文件

#include
#include
#include
#include
#include"dseqlist.h"


void InitSeqList(PDSeqList ps)
{
    assert(ps != NULL);
    ps->length = 0;
    ps->elem = (int *)malloc(INITSIZE*sizeof(int));//这块跟定长不同需要动态开辟
    ps->listsize = INITSIZE;
}
static bool Isfull(PDSeqList ps)
{
    return ps->length == ps->listsize;
}

static void Inc(PDSeqList ps)//扩容函数
{
    ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
    //我们一定要熟悉realloc malloc这两个函数,它们很重要
}

bool Insert(PDSeqList ps,int pos,int val)
{
    assert(ps != NULL);
    int i = 0;
    if(pos < 0 || pos > ps->length)//如果pos>ps->length 就说明越界了
    {
        return false;
    }
    //这里要考虑扩容情况
    if(Isfull(ps))
    {
        Inc(ps);//扩容
    }

    i = ps->length - 1;
    for( ;i >= pos;i--)
    {
        ps->elem[i+1] = ps->elem[i];
    }
    ps->elem[pos] = val;
    ps->length++;
    return true;
}

bool DeletePos(PDSeqList ps,int pos)
{
    assert(ps != NULL);
    int i = 0;
    if(pos < 0 || pos > ps->length)
    {
        return false;
    }
    i = pos;
    for(;i < ps->length;i++)
    {
        ps->elem[i] = ps->elem[i+1];
    }
    ps->length--;
    return true;

}

int Search(PDSeqList ps,int key)
{
    assert(ps != NULL);
    int i = 0;
    for(i = 0;i < ps->length;i++)
    {
        if(ps->elem[i] == key)
        {
            return i;
        }
    }
    return -1;
}
bool IsEmpty(PDSeqList ps)
{
    return ps->length == 0;
}
bool DeleteVal(PDSeqList ps,int key)
{
    assert(ps != NULL);
    int i = 0;
    if(Search(ps,key) == -1 || IsEmpty(ps))
    {
        return false;
    }
    i = Search(ps,key);
    for(;i length-1 ;i++)
    {
        ps->elem[i] = ps->elem[i+1];
    }
    ps->length--;
    return true;
}

int GetLength(PDSeqList ps)
{
    return ps->length;
}

void Clear(PDSeqList ps)
{
    ps->length = 0;
}

void  Destroy(PDSeqList ps)
{
    free(ps->elem);//我们一定要free掉这个动态指针
    ps->listsize = 0;//将存储空间置0
    ps->length = 0;//将有效个数置0
    ps->elem = NULL;//提高健壮性
}

void Show(PDSeqList ps)
{
    int i = 0;
    for(; i < ps->length;i++)
    {
        printf("%d\n",ps->elem[i]);
        printf("\n");
    }
}

我们最后来写测试代码
test.cpp文件

#include
#include"dseqlist.h"

int main()
{
    DSeqList s;
    InitSeqList(&s);//一定要初始化
    for(int i=0;i<15;i++)
    {
        Insert(&s,i,i);
    }
    //printf("%d\n",DeleteVal(&s,15));
    Show(&s);
    Destroy(&s);

    return 0;
}

不定长也写完了,就是多了一个malloc,其他和定长顺序表是一样的。

你可能感兴趣的:(数据结构,数据结构)