当前位置:主页 > c/c++教程 > C语言动态顺序表

C语言实现动态顺序表的示例代码

发布:2023-03-06 14:00:01 59


本站收集了一篇相关的编程文章,网友文和泽根据主题投稿了本篇教程内容,涉及到C语言、动态顺序表、C语言、顺序表、C语言动态顺序表相关内容,已被569网友关注,相关难点技巧可以阅读下方的电子资料。

C语言动态顺序表

顺序表概念及结构

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

分类:

一般分为静态顺序表和动态顺序表;

静态顺序表:数组大小是固定的用完了无法增容;同时我们无法控制给数组开多少空间合适,开少了,空间不够;开多了,有回会存在空间浪费;

动态顺序表:空间是可以变动的,空间满了我们就增容;解决了静态顺序表的空间不足问题,同时也在一定程度上减少了空间浪费;

因此本篇博客主要实现动态顺序表;(静态顺序表实现思路差不多,读者可以自行写一下)

动态顺序表数据结构:

基本操作

#pragma once
#include 
#include 
#include 
#include
typedef int SLDateType;
typedef struct SeqList
{
	SLDateType* a;//用于维护动态开辟的数组
	size_t size;//用于维护动态数组有多少个有效值
	size_t capacity; // size_t==unsigned int//用于维护当前动态数组有多少空间
}SeqList;

// 对数据的管理:增删查改 
//初始化顺序表
void SeqListInit(SeqList* ps);
//销毁顺序表
void SeqListDestroy(SeqList* ps);
//显示顺序表
void SeqListPrint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLDateType x);
//头插
void SeqListPushFront(SeqList* ps, SLDateType x);
//头删
void SeqListPopFront(SeqList* ps);
//尾删
void SeqListPopBack(SeqList* ps);
// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);

功能实现

#include"SeqList.h"
static void Check_Capacity(SeqList* ps)
{
    if (ps->capacity == ps->size)//容量满了或者还没开辟空间
    {
        size_t NewCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;
        int* tmp = (int*)realloc(ps->a, NewCapacity * sizeof(int));
        if (tmp == NULL)
            exit(-1);
        ps->a = tmp;
        ps->capacity = NewCapacity;
    }
}
void SeqListInit(SeqList* ps)
{
    assert(ps);
    ps->a = NULL;
    ps->capacity = 0;
    ps->size = 0;
}
void SeqListDestroy(SeqList* ps)
{
    assert(ps);
        free(ps->a);
        ps->capacity = 0;
        ps->size = 0;
}
void SeqListPrint(SeqList* ps)
{
    assert(ps);
    if (ps->size)
    {
        int len = ps->size;
        for (int i = 0; i a[i]);
    }
    else
        printf("NULL\n");
}
void SeqListPushBack(SeqList* ps, SLDateType x)
{
    assert(ps);
    Check_Capacity(ps);
    //在插入数据之前要先检查一下是否还有剩余容量
    ps->a[ps->size] = x;
    ps->size++;
}
void SeqListPushFront(SeqList* ps, SLDateType x)
{
    assert(ps);
    Check_Capacity(ps);
    int end = ps->size - 1;
    for (end; end >= 0; end--)
        ps->a[end + 1] = ps->a[end];
    ps->a[end + 1] = x;
    ps->size++;

}
void SeqListPopFront(SeqList* ps)
{
    assert(ps);
    assert(ps->size>0);//都没元素了就不删了
    int begin = 1;
    int len = ps->size;
    for (begin; begin < len; begin++)
        ps->a[begin - 1] = ps->a[begin];
    ps->size--;
}
void SeqListPopBack(SeqList* ps)
{
    assert(ps);
    assert(ps->size>0);
    ps->size--;
}
int SeqListFind(SeqList* ps, SLDateType x)
{
    assert(ps);
    assert(ps->size>0);
    int len = ps->size;
    for (int i = 0; i < len; i++)
        if (ps->a[i] == x)
            return i;
    return -1;
}
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
    assert(ps);
    //如果pos给我乱传,超出合法范围?
    assert(pos<=ps->size);
    Check_Capacity(ps);
    int end = ps->size - 1;
    int target = pos;
    for (; end >= target; end--)//这里会发生向上转换,最好把pos类型转换一下
        ps->a[end + 1] = ps->a[end];
    ps->a[end+1] = x;
    ps->size++;

}

void SeqListErase(SeqList* ps, size_t pos)
{
    assert(ps);
    assert(ps->size>0);
    //pos乱传?
    assert(pos<=ps->size);
    int begin = pos + 1;
    int len = ps->size;
    for (; begin < len; begin++)
    {
        ps->a[begin - 1] = ps->a[begin];
    }
    ps->size--;
}

程序运行

到此这篇关于C语言实现动态顺序表的示例代码的文章就介绍到这了,更多相关C语言动态顺序表内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • C语言实现打印数字金字塔

    发布:2023-03-11

    这篇文章主要介绍了C语言实现打印数字金字塔方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • 详解C语言内核中的自旋锁结构

    发布:2023-03-02

    自旋锁是内核中提供的一种高IRQL锁,用同步以及独占的方式访问某个资源。自旋锁是为了解决内核链表读写时存在线程同步问题。本文将讲解一下自旋锁的简单应用,感兴趣的可以了解一下


  • C语言实现C++继承和多态的实例内容

    发布:2021-06-10

    本文主要给大家简单讲诉了C和C++的区别以及如何使用C语言模拟实现C++继承和多态,并附上示例代码,是篇相当不错的文章,推荐给喜欢C语言的小伙伴们


  • C语言结构体字节对齐的实现深入分析

    发布:2023-03-05

    这篇文章主要介绍了C语言结构体字节对齐的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • 浅谈使用C++多级指针存储海量qq号和密码

    发布:2022-10-18

    给网友们整理关于C++的教程,这篇文章主要介绍了浅谈使用C++多级指针存储海量qq号和密码,分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下


  • C语言实现通讯录的示例代码

    发布:2023-03-04

    这篇文章主要为大家详细介绍了如何录音C语言实现一个简单的通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • C语言实现酒店管理系统

    发布:2023-01-18

    给大家整理了关于C语言的教程,这篇文章主要为大家详细介绍了C语言实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • C语言实现三子棋游戏的示例代码

    发布:2023-03-04

    今天我们将会用C语言实现三子棋。所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜。话不多说,我们开始吧


网友讨论