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

接下来我将详细讲解 C 语言动态顺序表的实现过程。首先我们需要先了解顺序表的概念,顺序表是一种线性表的存储结构,它在物理上采用一组连续的内存空间来存储线性表的数据元素,并且对于顺序表的元素,我们可以按照元素下标进行随机存取。接下来我们就可以开始进行动态顺序表的实现了。

动态顺序表的实现

初步设计

首先我们需要先建立一个动态顺序表结构体,它包含了以下几个基本成员变量:

typedef struct {
    int *elem;      // 存储空间的基地址
    int length;     // 当前顺序表的长度
    int capacity;   // 顺序表的初始容量
} SeqList;

我们可以使用 malloc() 函数在内存中申请空间,对应到模拟该数据结构中,初始化时需分配初始空间。在动态顺序表中,我们需要提供插入、删除、查找等操作,下面是对应的函数实现:

插入元素

bool insert(SeqList *L, int index, int value) {
    // 首先需要判断插入位置的合法性
    if (index < 1 || index > L->length + 1) {
        return false;
    }

    // 需要判断顺序表是否已满
    if (L->length >= L->capacity) {
        // 如果已满,需要进行扩容
        int *new_base = (int *)realloc(L->elem, 
            (L->capacity + LIST_INCREMENT) * sizeof(int));

        // 判断是否分配成功
        if (!new_base) {
            return false;
        }

        // 修改当前顺序表的存储基址和容量
        L->elem = new_base;
        L->capacity += LIST_INCREMENT;
    }

    // 进行元素插入,需要从后往前依次将元素后移
    for (int i = L->length; i >= index; i--) {
        L->elem[i] = L->elem[i - 1];
    }
    L->elem[index - 1] = value;
    // 插入成功后需要将顺序表长度加一
    L->length++;
    return true;
}

删除元素

bool delete(SeqList *L, int index) {
    // 首先需要判断删除位置的合法性
    if (index < 1 || index > L->length) {
        return false;
    }

    // 进行元素删除,需要从该位置开始将元素依次向前移动
    for (int i = index; i < L->length; i++) {
        L->elem[i - 1] = L->elem[i];
    }
    // 删除后需要将顺序表长度减一
    L->length--;
    return true;
}

查找元素

int search(SeqList *L, int value) {
    for (int i = 0; i < L->length; i++) {
        if (L->elem[i] == value) {
            // 找到后返回该元素在顺序表中的位置
            return i + 1;
        }
    }
    // 找不到返回 -1
    return -1;
}

示例说明

下面提供两个示例来说明动态顺序表的使用。

示例一:对一个用户输入的数组建立一个动态顺序表

#include <stdio.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10

typedef struct {
    int *elem;
    int length;
    int capacity;
} SeqList;

bool insert(SeqList *L, int index, int value) {
    // 首先需要判断插入位置的合法性
    if (index < 1 || index > L->length + 1) {
        return false;
    }

    // 需要判断顺序表是否已满
    if (L->length >= L->capacity) {
        // 如果已满,需要进行扩容
        int *new_base = (int *)realloc(L->elem, 
            (L->capacity + LIST_INCREMENT) * sizeof(int));

        // 判断是否分配成功
        if (!new_base) {
            return false;
        }

        // 修改当前顺序表的存储基址和容量
        L->elem = new_base;
        L->capacity += LIST_INCREMENT;
    }

    // 进行元素插入,需要从后往前依次将元素后移
    for (int i = L->length; i >= index; i--) {
        L->elem[i] = L->elem[i - 1];
    }
    L->elem[index - 1] = value;
    // 插入成功后需要将顺序表长度加一
    L->length++;
    return true;
}

bool delete(SeqList *L, int index) {
    // 首先需要判断删除位置的合法性
    if (index < 1 || index > L->length) {
        return false;
    }

    // 进行元素删除,需要从该位置开始将元素依次向前移动
    for (int i = index; i < L->length; i++) {
        L->elem[i - 1] = L->elem[i];
    }
    // 删除后需要将顺序表长度减一
    L->length--;
    return true;
}

int search(SeqList *L, int value) {
    for (int i = 0; i < L->length; i++) {
        if (L->elem[i] == value) {
            // 找到后返回该元素在顺序表中的位置
            return i + 1;
        }
    }
    // 找不到返回 -1
    return -1;
}

int main() {
    int n, temp;
    SeqList list;
    list.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    list.capacity = LIST_INIT_SIZE;
    list.length = 0;

    printf("请输入数组长度n:");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        printf("请输入第%d个元素:", i);
        scanf("%d", &temp);
        insert(&list, i, temp);
    }

    printf("当前顺序表中的元素为:");
    for (int i = 0; i < list.length; i++) {
        printf("%d ", list.elem[i]);
    }
    printf("\n");

    return 0;
}

运行效果如下:

请输入数组长度n:5
请输入第1个元素:1
请输入第2个元素:3
请输入第3个元素:5
请输入第4个元素:7
请输入第5个元素:9
当前顺序表中的元素为:1 3 5 7 9 

示例二:使用动态顺序表实现一个小游戏

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10

typedef struct {
    int *elem;
    int length;
    int capacity;
} SeqList;

bool insert(SeqList *L, int index, int value) {
    // 首先需要判断插入位置的合法性
    if (index < 1 || index > L->length + 1) {
        return false;
    }

    // 需要判断顺序表是否已满
    if (L->length >= L->capacity) {
        // 如果已满,需要进行扩容
        int *new_base = (int *)realloc(L->elem, 
            (L->capacity + LIST_INCREMENT) * sizeof(int));

        // 判断是否分配成功
        if (!new_base) {
            return false;
        }

        // 修改当前顺序表的存储基址和容量
        L->elem = new_base;
        L->capacity += LIST_INCREMENT;
    }

    // 进行元素插入,需要从后往前依次将元素后移
    for (int i = L->length; i >= index; i--) {
        L->elem[i] = L->elem[i - 1];
    }
    L->elem[index - 1] = value;
    // 插入成功后需要将顺序表长度加一
    L->length++;
    return true;
}

bool delete(SeqList *L, int index) {
    // 首先需要判断删除位置的合法性
    if (index < 1 || index > L->length) {
        return false;
    }

    // 进行元素删除,需要从该位置开始将元素依次向前移动
    for (int i = index; i < L->length; i++) {
        L->elem[i - 1] = L->elem[i];
    }
    // 删除后需要将顺序表长度减一
    L->length--;
    return true;
}

int search(SeqList *L, int value) {
    for (int i = 0; i < L->length; i++) {
        if (L->elem[i] == value) {
            // 找到后返回该元素在顺序表中的位置
            return i + 1;
        }
    }
    // 找不到返回 -1
    return -1;
}

bool playGame(SeqList *L) {
    printf("游戏开始!\n");
    int count = 0;

    // 随机选择一个数
    srand((unsigned)time(NULL));
    int target = rand() % 1000 + 1;

    while (1) {
        int guess;
        printf("请输入您猜测的数字:");
        scanf("%d", &guess);
        count++;

        if (search(L, guess) != -1) {
            printf("您已经猜测过这个数字,请重新输入。\n");
        } else {
            if (guess < target) {
                printf("您输入的数字小了,请再次猜测!\n");
                insert(L, L->length + 1, guess);
            } else if (guess > target) {
                printf("您输入的数字大了,请再次猜测!\n");
                insert(L, L->length + 1, guess);
            } else {
                printf("恭喜您猜对了!您一共猜了%d次。\n", count);
                return true;
            }
        }
    }
}

int main() {
    SeqList list;
    list.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    list.capacity = LIST_INIT_SIZE;
    list.length = 0;

    playGame(&list);

    free(list.elem);
    return 0;
}

运行效果如下:

游戏开始!
请输入您猜测的数字:500
您输入的数字小了,请再次猜测!
请输入您猜测的数字:750
您输入的数字小了,请再次猜测!
请输入您猜测的数字:875
您输入的数字小了,请再次猜测!
请输入您猜测的数字:937
您输入的数字大了,请再次猜测!
请输入您猜测的数字:906
恭喜您猜对了!您一共猜了5次。

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

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

相关文章

  • c++ 探讨奶牛生子的问题

    C++ 探讨奶牛生子的问题 问题描述 有 $N$ 只奶牛,每个奶牛的繁殖周期为 $M$ 年,每只奶牛出生后第 $1$ 年不生育,第 $2$ 年起每年生下一只小奶牛,小奶牛出生后第 $1$ 年也不能生育,第 $2$ 年起也可以生下一只小奶牛。假设所有的奶牛都没有死亡,请问 $T$ 年后一共有多少只奶牛? 解题思路 本题可以采用递归或者动态规划的方式进行求解。我…

    C 2023年5月23日
    00
  • 在Shell命令行处理JSON数据的方法

    在Shell命令行处理JSON数据的方法是非常常用的任务之一,下面是处理JSON数据的完整攻略: 1. 什么是JSON? JSON(JavaScript Object Notation)是一种常用的轻量级数据交换格式。可以理解为是一种数据结构,它由键值对构成,键和值之间使用:号连接。键值对中的项之间使用逗号分隔。大括号({})表示对象,中括号([])表示数组…

    C 2023年5月23日
    00
  • JSP学习之异常处理实例分析

    JSP学习之异常处理实例分析 异常处理概述 在Java程序中,异常是指程序在执行过程中出现的错误。通常情况下,我们希望程序能够自动捕获这些异常,并对其进行处理。这就需要使用异常处理机制。 JSP中也同样具备处理异常的能力,可以通过try…catch…代码块来捕获异常并处理异常。本文将介绍具体如何在JSP中处理异常,同时提供几个异常处理的实例用于帮助读…

    C 2023年5月23日
    00
  • C++如何通过ostringstream实现任意类型转string

    使用ostringstream可以方便地将任意类型转换成string类型。下面是具体的攻略: 步骤一:引入头文件 首先需要引入头文件<sstream>,因为ostringstream类定义在这个头文件中。 #include <sstream> 步骤二:定义一个ostringstream对象 ostringstream oss; 定义一…

    C 2023年5月23日
    00
  • C语言中如何进行代码注释?

    当我们写代码时,必须添加注释来使代码更加易于阅读和理解。在C语言中,有两种类型的注释,即单行注释和多行注释。 单行注释 单行注释用于在代码行末尾添加注释。在C语言中,单行注释以双斜杠“//”开始,直到该行的结尾。例如: // 这是一条单行注释 int a = 10; // 这是在同一行之后的注释 多行注释 多行注释用于在一段代码中添加注释。在C语言中,多行注…

    C 2023年4月27日
    00
  • linux c程序中获取shell脚本输出的实现方法

    获取shell脚本输出是Linux C编程中的一个常见需求,通常的实现方法是通过调用Linux系统的管道机制来实现。下面是具体的攻略: 步骤1:运行shell脚本并将输出写入到管道中 代码示例: $ echo "hello world" > /tmp/output.txt 上述示例向文件output.txt中写入了一行文本。要将其写…

    C 2023年5月30日
    00
  • JS 实现Json查询的方法实例

    JS 实现JSON查询的方法实例 在项目中,我们常常需要通过给定的条件查询数据。如果数据存储在JSON格式的文件中,我们可以使用JS实现JSON查询。下面是JS实现JSON查询的方法实例。 1. 获取JSON数据 首先,我们需要获取JSON数据。这可以是从服务器或本地文件中获取。在本例中,我们将使用本地文件。我们可以使用XMLHttpRequest对象获取J…

    C 2023年5月23日
    00
  • C语言图书管理系统课程设计

    C语言图书管理系统课程设计攻略 1. 需求分析 首先,需要进行需求分析,确定图书管理系统需要实现哪些功能,这些功能包括但不限于: 图书的添加、删除、修改、查询等操作 用户的注册、登录、注销等操作 借阅、归还等操作 统计功能、报表生成等操作 2. 设计数据库 接下来,需要设计系统所使用的数据库,可以使用MySQL、SQLite等关系型数据库管理系统。可以创建如…

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