欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据结构与算法之顺序表C语言实现

程序员文章站 2022-03-24 22:41:41
顺序表等相关概念请自行查阅资料,这里主要是实现。 注: 1.顺序表C语言实现; 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善; 3.提供几个简单函数,可自行添加功能; 4.可用C++封装,得知STL中vector原理。 顺序表容量。 顺序表结构体。 部分操作,可自行添加其他操作。 ......

顺序表等相关概念请自行查阅资料,这里主要是实现。

注:

1.顺序表c语言实现;

2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善;

3.提供几个简单函数,可自行添加功能;

4.可用c++封装,得知stl中vector原理。

 

 顺序表容量。

#define capacity 20 //容量

顺序表结构体。

typedef struct 
{
    int *m_phead; //指向数组头
    int m_isize; //大小
    int m_icapacity; //容量
}stable;

部分操作,可自行添加其他操作。

stable* createtable();
void appendelement(stable* ptable, int ielement);
void insertelement(stable* ptable, int ielement, int index);
void delelement(stable* ptable, int index);
int getat(stable* ptable, int index);
void setat(stable* ptable, int ielement, int index);
void showtable(stable* ptable);
void releasemem(stable* ptable);

分配内存,元素个数为0。

stable* createtable()
{
    stable *ptable = (stable*)malloc(sizeof(stable));
    if(!ptable)
    {
        printf("动态内存分配失败!\n");
        return ptable;
    }

    ptable->m_phead = (int*)malloc(sizeof(int) * capacity);
    if(!ptable->m_phead)
    {
        printf("动态内存分配失败!\n");
        return null;
    }

    ptable->m_isize = 0;
    ptable->m_icapacity = capacity;

    return ptable;
}

追加

void appendelement(stable* ptable, int ielement) 
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return;
    }

    if(ptable->m_isize == ptable->m_icapacity)
    {
        printf("顺序表已满!\n"); //可以重新分配内存 这里就不实现了 从简
        return;
    }
    
    ptable->m_phead[ptable->m_isize] = ielement;
    ptable->m_isize++;
}

插入

void insertelement(stable* ptable, int ielement, int index)
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return;
    }

    if(ptable->m_isize == ptable->m_icapacity)
    {
        printf("顺序表已满!\n"); //可以重新分配内存 这里就不实现了 从简
        return;
    }

    if(index < 0 || index > ptable->m_isize)
    {
        printf("插入位置不合理!\n");
        return;
    }

    //后移
    for(int i = ptable->m_isize - 1; i >= index; i--)
    {
        ptable->m_phead[i+1] = ptable->m_phead[i];
    }
    ptable->m_phead[index] = ielement;
    ptable->m_isize++;
}

删除

void delelement(stable* ptable, int index)
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return;
    }

    if(ptable->m_isize < 1)
    {
        printf("顺序表元素个数为0!\n");
        return;
    }

    if(index < 0 || index > ptable->m_isize - 1)
    {
        printf("删除元素位置不合理!\n");
        return;
    }

    //前移
    for(int i = index; i < ptable->m_isize - 1; i++)
    {
        ptable->m_phead[i] = ptable->m_phead[i+1];
    }

    ptable->m_isize--;
}

获取

int getat(stable* ptable, int index)
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return -1;
    }

    if(index < 0 || index > ptable->m_isize - 1)
    {
        printf("索引不合理!\n");
        return -1;
    }

    return ptable->m_phead[index];
}

修改

void setat(stable* ptable, int ielement, int index)
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return;
    }

    if(index < 0 || index > ptable->m_isize - 1)
    {
        printf("索引不合理!\n");
        return;
    }

    ptable->m_phead[index] = ielement;
}

打印所有元素。

void showtable(stable* ptable)
{
    if(!ptable || !ptable->m_phead)
    {
        printf("顺序表不存在!\n");
        return;
    }

    printf("容量:%d,大小:%d,打印元素:\n", ptable->m_icapacity, ptable->m_isize);
    for(int i = 0; i < ptable->m_isize; i++)
        printf("%d ", ptable->m_phead[i]);

    printf("\n");
}

内存释放。

void releasemem(stable* ptable)
{
    if(!ptable)
    {
        printf("顺序表不存在!\n");
        return;
    }

    if(ptable->m_phead)
        free(ptable->m_phead);

    free(ptable);
    printf("内存释放成功!\n");
}