数据结构之顺序表

本文详细介绍了顺序表的概念和基本操作,包括设计、初始化、增加、显示、查找、删除和销毁顺序表。通过C语言代码展示了如何创建、管理及操作顺序表,包括在顺序表的头部插入元素、遍历显示元素、查找和删除特定元素等功能。此外,还提供了完整的主函数示例来演示这些操作。
摘要由CSDN通过智能技术生成

目录

1.概念

2.基本操作

(1)设计

(2)初始化

(3)增加

(4)显示顺序表中的数据元素

(5)查找

(6)删除

(7)删除顺序表

(8)引用


1.概念

        按顺序存储的线性表,用一组连续的存储单元依次存储线性表中的数据元素。在C语言中,可以是使用栈空间的数组,也可以使用堆空间的数组。

2.基本操作

(1)设计

        为了方便管理顺序表,设计一个管理顺序表的“管理结构体”管理结构体中包含:

        1. 顺序表的容量
        2. 顺序表中最后一个元素
        3. 顺序表的地址
typedef struct{
    int cap; //顺序表的容量
    int last; //最后一个元素的下标
    int *data; //顺序表,以整型为例
}sequencelist;

(2)初始化

设置好管理结构体中顺序表的容量、末元素下标,申请好顺序表的内存空间等系列工作示例代码:

/* 创建一个顺序表 */
sequencelist *init_list(int cap)
{
    sequencelist *list = malloc(sizeof(sequencelist));
    if(list != NULL)
    {
        list->data = malloc(sizeof(int) * cap);
        if(list->data == NULL)
        {
            free(list);
            return NULL;
        }
        list->capacity = cap;
        list->last = -1;
    }
    return list;
}

(3)增加

        在顺序表中增加一个节点数据,可以有多种方式,比如在原数组的末尾增加,或者在原数组的头部增加,或者在原数组中间的任意一个位置增加。根据实际需要来确定。

/* 增加节点,每次都在顺序表的头部插入 */
bool insert(sequencelist *list, int data)
{
    //判断顺序表容量是否满
    if(isFull(list))
        return false;
    
    //将原来的数据向后挪一位
    for(int i=list->last; i>=0; i--)
    {
        list->data[i+1] = list->data[i];
    }

    //将新数据插入头部
    list->data[0] = data;
    list->last++;

    return true;
}

(4)显示顺序表中的数据元素

/* 遍历显示顺序表的数据元素 */
void show(sequencelist *list)
{
    //判断顺序表是否为空
    if(isEmpty(list))
        return;
    for (size_t i = 0; i <= list->last; i++)
    {
        printf("%d\t", list->data[i]);
    }
    printf("\n");
    
}

(5)查找

遍历整个数组元素,查找指定的数据元素

/* 在顺序表中搜索数据元素 */
int find(sequencelist *list, int data)
{
    int pos = -1;
    for (size_t i = 0; i <= list->last; i++)
    {
        if(list->data[i] == data)
        {
            pos = i;
            break;
        }
    }
    return pos;
}

(6)删除

        查找数据元素,将数据重原数组中进行剔除

bool deleta(sequencelist *list, int data)
{
    if(isEmpty(list))
        return false;
    int pos = find(list, data);
    if(pos == -1)
    {
        printf("查无此数\n");
        return false;
    }
    for(int i=pos; i<=list->last; i++)
    {
        list->data[i] = list->data[i+1];
    }
    list->last--;

    return true;
}

(7)删除顺序表

        一个顺序表最后不再需要,应当释放其所占用的内存空间。

void destroy(sequencelist *list)
{
    if(list == NULL)
        return;
    free(list->data);
    free(list);
    list = NULL;
}

(8)引用

int main(void)
{
    //初始化一个顺序表
    sequencelist *list = init_list(10);
    if(list == NULL)
    {
        perror("初始化顺序表失败");
        exit(0);
    }
    else
        printf("初始化循序表成功\n");
    int num;
    while(1)
    {
        scanf("%d", &num);
        if(num > 0)
        {
            if(!insert(list, num))
            {
                printf("容量已满,插入失败\n");
                continue;
            }
        }
        else if(num < 0)
        {
            if(!deleta(list, -num))
            {
                printf("删除失败\n");
                continue;
            }
        }
        else
            break;

        show(list);

    }

    destroy(list);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值