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

让我来为大家详细讲解一下如何使用C语言实现动态顺序表的实现代码。

1. 动态顺序表的概述

动态顺序表是一种线性表,它基于数组实现。动态顺序表可以自动扩充或缩小其容量以存储数据。动态顺序表中元素的位置是按照它们在数组中的位置来确定的。它们在内存中是连续存储的,因此它们可以通过下标快速访问。

2. 动态顺序表的实现

我们使用C语言的方法来实现动态顺序表。首先,我们需要定义一些数据结构来表示动态顺序表。我们定义一个叫做SeqList的结构体表示动态顺序表:

#define DEFAULT_CAPACITY 10

typedef struct {
    int* data;
    int capacity;
    int size;
} SeqList;

其中:

  • data:表示存储数据的数组。
  • capacity:表示当前动态顺序表的容量。
  • size:表示当前动态顺序表中的元素数量。

我们使用malloc函数来为data分配内存。

SeqList* SeqList_Create() {
    SeqList* list = (SeqList*)malloc(sizeof(SeqList));
    list->data = (int*)malloc(DEFAULT_CAPACITY * sizeof(int));
    list->capacity = DEFAULT_CAPACITY;
    list->size = 0;
    return list;
}

为了保证动态顺序表有足够的存储空间存储元素,我们需要扩充它的容量。

int SeqList_Expand(SeqList* list) {
    int* oldData = list->data;
    int oldCapacity = list->capacity;
    int newCapacity = oldCapacity * 2;
    list->data = (int*)malloc(newCapacity * sizeof(int));
    if (list->data == NULL) {
        list->data = oldData;
        list->capacity = oldCapacity;
        return 0;
    }
    int i;
    for (i = 0; i < oldCapacity; i++) {
        list->data[i] = oldData[i];
    }
    list->capacity = newCapacity;
    free(oldData);
    return 1;
}

我们还需要实现插入元素、删除元素和访问元素等操作:

int SeqList_Insert(SeqList* list, int pos, int value) {
    if (pos < 0 || pos > list->size) {
        return 0;
    }
    if (list->size >= list->capacity) {
        if (!SeqList_Expand(list)) {
            return 0;
        }
    }
    int i;
    for (i = list->size; i > pos; i--) {
        list->data[i] = list->data[i-1];
    }
    list->data[pos] = value;
    list->size++;
    return 1;
}

int SeqList_Delete(SeqList* list, int pos) {
    if (pos < 0 || pos >= list->size) {
        return 0;
    }
    int i;
    for (i = pos; i < list->size-1; i++) {
        list->data[i] = list->data[i+1];
    }
    list->size--;
    return 1;
}

int SeqList_Get(SeqList* list, int pos, int* value) {
    if (pos < 0 || pos >= list->size) {
        return 0;
    }
    *value = list->data[pos];
    return 1;
}

完整的实现代码如下:

#include <stdlib.h>

#define DEFAULT_CAPACITY 10

typedef struct {
    int* data;
    int capacity;
    int size;
} SeqList;

SeqList* SeqList_Create() {
    SeqList* list = (SeqList*)malloc(sizeof(SeqList));
    list->data = (int*)malloc(DEFAULT_CAPACITY * sizeof(int));
    list->capacity = DEFAULT_CAPACITY;
    list->size = 0;
    return list;
}

int SeqList_Expand(SeqList* list) {
    int* oldData = list->data;
    int oldCapacity = list->capacity;
    int newCapacity = oldCapacity * 2;
    list->data = (int*)malloc(newCapacity * sizeof(int));
    if (list->data == NULL) {
        list->data = oldData;
        list->capacity = oldCapacity;
        return 0;
    }
    int i;
    for (i = 0; i < oldCapacity; i++) {
        list->data[i] = oldData[i];
    }
    list->capacity = newCapacity;
    free(oldData);
    return 1;
}

int SeqList_Insert(SeqList* list, int pos, int value) {
    if (pos < 0 || pos > list->size) {
        return 0;
    }
    if (list->size >= list->capacity) {
        if (!SeqList_Expand(list)) {
            return 0;
        }
    }
    int i;
    for (i = list->size; i > pos; i--) {
        list->data[i] = list->data[i-1];
    }
    list->data[pos] = value;
    list->size++;
    return 1;
}

int SeqList_Delete(SeqList* list, int pos) {
    if (pos < 0 || pos >= list->size) {
        return 0;
    }
    int i;
    for (i = pos; i < list->size-1; i++) {
        list->data[i] = list->data[i+1];
    }
    list->size--;
    return 1;
}

int SeqList_Get(SeqList* list, int pos, int* value) {
    if (pos < 0 || pos >= list->size) {
        return 0;
    }
    *value = list->data[pos];
    return 1;
}

3. 示例说明

示例1:插入元素

以下是插入元素的示例代码:

#include <stdio.h>

int main() {
    SeqList* list = SeqList_Create();
    SeqList_Insert(list, 0, 1);
    SeqList_Insert(list, 0, 2);
    SeqList_Insert(list, 1, 3);
    int i, value;
    for (i = 0; i < list->size; i++) {
        SeqList_Get(list, i, &value);
        printf("%d ", value);
    }
    printf("\n");
    SeqList_Delete(list, 1);
    for (i = 0; i < list->size; i++) {
        SeqList_Get(list, i, &value);
        printf("%d ", value);
    }
    printf("\n");
    return 0;
}

输出结果为:

2 3 1
2 1

在这个示例中,我们创建了一个动态顺序表,并向其中插入了三个元素。然后,我们遍历动态顺序表中的所有元素并打印它们。接着,我们删除了第一个插入的元素,并再次遍历动态顺序表中的所有元素并打印它们。

示例2:访问元素

以下是访问元素的示例代码:

#include <stdio.h>

int main() {
    SeqList* list = SeqList_Create();
    SeqList_Insert(list, 0, 1);
    SeqList_Insert(list, 0, 2);
    SeqList_Insert(list, 1, 3);
    int value;
    SeqList_Get(list, 1, &value);
    printf("%d\n", value);
    return 0;
}

输出结果为:

3

在这个示例中,我们创建了一个动态顺序表,并向其中插入了三个元素。然后,我们访问动态顺序表中的第二个元素,并打印它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现动态顺序表的实现代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言实现简单通讯录系统

    C语言实现简单通讯录系统攻略 1. 确定功能需求 在开始编写代码前,需要明确实现的功能需求。一个简单的通讯录功能包含以下几个方面: 添加联系人; 显示联系人列表; 修改联系人信息; 删除联系人。 2. 设计数据结构 在C语言中,可以使用结构体来存储联系人的相关信息。为了方便,我们可以使用动态内存分配来动态地创建存储联系人的结构体。 typedef struc…

    C 2023年5月23日
    00
  • C语言局部数据指针

    当我们在写C语言程序时,经常会定义一些变量,这些变量可以是全局变量,也可以是局部变量。而局部变量是指定义在函数内部或代码块内部的变量,这些变量的作用域仅限于定义它们的函数或代码块内部。那么在定义局部变量时,我们可以定义一个指针变量,它可以指向局部变量的地址。这就是C语言局部数据指针的使用方法。 如下是C语言局部数据指针的使用攻略: 1. 定义局部变量和指针变…

    C 2023年5月9日
    00
  • 一文带你了解Rust是如何处理错误的

    一文带你了解Rust是如何处理错误的 在Rust中,错误是一等公民。这意味着Rust程序员需要显式地处理错误,不能将错误掩盖或忽略掉。这篇文章将介绍Rust中的错误处理方式。 错误类型 在Rust中,错误类型通常是实现了标准库中的std::error::Errortrait的结构体。这个trait有两个方法:description 和 cause,分别用于返…

    C 2023年5月23日
    00
  • C语言求字符串长度的四种方法实例代码

    下面是针对“C语言求字符串长度的四种方法实例代码”这个主题的完整攻略: 一、背景 在C语言中,获取字符串长度是一个比较基础的操作,它在很多情况下都非常有用。本文将介绍四种常见的C语言获取字符串长度的方法,逐一进行讲解和实例演示。 二、方法一:使用strlen()函数 strlen()函数是C语言中用于获取字符串长度的标准函数,它的使用非常简单,直接传入字符串…

    C 2023年5月24日
    00
  • 超详细VScode调试教程tasks.json和launch.json的设置

    针对“超详细VScode调试教程tasks.json和launch.json的设置”的完整攻略,我将分为以下四个部分进行讲解: 简介 tasks.json的设置 launch.json的设置 示例说明 1. 简介 VScode是广受开发者欢迎的一款编辑器,其中调试功能让我们在开发过程中可以更直观地查看程序运行过程。而tasks.json和launch.jso…

    C 2023年5月23日
    00
  • Linux中用于进程显示的top命令使用实例集锦

    Linux中用于进程显示的top命令使用实例集锦 什么是top命令 top命令是Linux系统中一款用于实时动态地显示系统中各个进程的资源占用情况的工具,是Linux系统管理和排查问题时非常有用的工具之一。在top命令的界面中,可以查看CPU、内存、I/O等各个方面的信息,可以通过top命令来快速发现系统中异常进程,进而对这些进程进行调整和优化。 top命令…

    C 2023年5月22日
    00
  • 在线管理数据库 类

    在线管理数据库类 在线管理数据库类是一种用于在网站中对数据库进行 CRUD 操作的工具类,可以提高网站开发的效率和代码复用性。本篇攻略将详细介绍如何使用在线管理数据库类,包括以下内容: 引入在线管理数据库类 初始化在线管理数据库类 实现增删改查操作 示例说明 1. 引入在线管理数据库类 要使用在线管理数据库类,需要先将其引入到项目中。可通过以下方式引入: &…

    C 2023年5月22日
    00
  • 如何修复Win11/10坏图像错误0xc0000020?

    当Win11/10出现坏图像错误0xc0000020时,可能是由于您的显卡驱动程序损坏或未正确安装。下面是完整的修复步骤: 步骤1:重新安装显卡驱动程序 1.打开设备管理器,展开“显示适配器”选项。 2.右击显示适配器,选择“卸载设备”。 3.下载并安装最新版本的显卡驱动程序,可以在厂商官网下载。 4.安装完成后,重启计算机,检查错误是否消失。 步骤2:运行…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部