C语言 数据结构之数组模拟实现顺序表流程详解

C语言 数据结构之数组模拟实现顺序表流程详解

什么是顺序表?

顺序表是一种基于连续存储结构的数据结构,它可以用一段连续的存储单元来存储线性表中的所有元素。

顺序表的实现思路

顺序表的实现主要依赖数组。我们可以定义一个数组来存储线性表的数据元素,同时再定义一个变量来保存线性表当前的长度。当需要对线性表进行插入、删除、查找等操作时,根据需求,可以通过数组的下标来进行对应元素的操作。

顺序表的实现代码

下面是一个简单的 C 语言代码,实现了一个顺序表的基本操作:创建、插入、删除、查找等。

#define MAXSIZE 100   // 定义顺序表数组的最大长度

typedef struct {
    int data[MAXSIZE];   // 存储顺序表数据元素的数组
    int length;          // 记录顺序表的当前长度
} SqList;

// 初始化一个空的顺序表
SqList InitList() {
    SqList list;
    list.length = 0;
    return list;
}

// 在顺序表的指定位置插入一个元素
int ListInsert(SqList *list, int index, int value) {
    // 判断插入位置是否非法
    if (index < 1 || index > list->length + 1) {
        return 0;
    }

    // 判断顺序表是否已满
    if (list->length >= MAXSIZE) {
        return 0;
    }

    // 将插入位置后的元素依次后移
    for (int i = list->length; i >= index; i--) {
        list->data[i] = list->data[i - 1];
    }

    // 在插入位置上插入新元素
    list->data[index - 1] = value;

    // 更新顺序表的长度
    list->length++;

    return 1;
}

// 从顺序表中删除指定位置的元素
int ListDelete(SqList *list, int index) {
    // 判断删除位置是否非法
    if (index < 1 || index > list->length) {
        return 0;
    }

    // 将删除位置后的元素依次前移
    for (int i = index; i < list->length; i++) {
        list->data[i - 1] = list->data[i];
    }

    // 更新顺序表的长度
    list->length--;

    return 1;
}

// 返回顺序表中指定元素的位置
int LocateElem(SqList *list, int value) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == value) {
            return i + 1;
        }
    }

    return 0;
}

顺序表的应用举例

示例一:输入员工信息,输出第一个工资高于平均水平的员工姓名

#include <stdio.h>

int main() {
    int n;   // 员工人数
    float sum = 0, avg;   // 工资总和、平均工资
    char name[20], max_name[20] = "";   // 员工姓名、工资最高者姓名
    int salary, max_salary = 0;   // 员工工资、工资最高者工资
    SqList list = InitList();   // 创建一个空的顺序表

    // 输入员工信息并将其存入顺序表中
    printf("请输入员工的个数:");
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        printf("请输入第 %d 个员工的姓名和工资:", i);
        scanf("%s %d", name, &salary);
        ListInsert(&list, i, salary);
        sum += salary;
    }

    // 计算平均工资
    avg = sum / n;

    // 找到工资最高者的工资和姓名
    for (int i = 1; i <= n; i++) {
        if (list.data[i - 1] > max_salary) {
            max_salary = list.data[i - 1];
            strcpy(max_name, name);
        }
    }

    // 输出第一个工资高于平均水平的员工姓名
    for (int i = 1; i <= n; i++) {
        if (list.data[i - 1] > avg) {
            printf("%s", name);
            break;
        }
    }

    return 0;
}

示例二:用顺序表实现栈

#include <stdio.h>

#define MAXSIZE 100   // 定义栈的最大长度

typedef struct {
    int data[MAXSIZE];   // 存储栈元素的数组
    int top;             // 栈顶指针
} Stack;

// 初始化一个空栈
Stack InitStack() {
    Stack s;
    s.top = -1;   // 表示栈空
    return s;
}

// 判断栈是否为空
int IsEmpty(Stack *s) {
    return s->top == -1;
}

// 判断栈是否已满
int IsFull(Stack *s) {
    return s->top == MAXSIZE - 1;
}

// 入栈
int Push(Stack *s, int value) {
    if (IsFull(s)) {
        return 0;
    }

    s->top++;
    s->data[s->top] = value;

    return 1;
}

// 出栈
int Pop(Stack *s, int *value) {
    if (IsEmpty(s)) {
        return 0;
    }

    *value = s->data[s->top];
    s->top--;

    return 1;
}

// 获取栈顶元素的值
int Top(Stack *s, int *value) {
    if (IsEmpty(s)) {
        return 0;
    }

    *value = s->data[s->top];

    return 1;
}

int main() {
    Stack s = InitStack();   // 创建一个空栈

    // 入栈
    Push(&s, 1);
    Push(&s, 2);
    Push(&s, 3);

    // 出栈
    int value;
    Pop(&s, &value);
    Pop(&s, &value);

    // 获取栈顶元素的值
    Top(&s, &value);
    printf("栈顶元素的值为:%d\n", value);

    return 0;
}

以上就是关于 C 语言 数组模拟实现顺序表的详细攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 数据结构之数组模拟实现顺序表流程详解 - Python技术站

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

相关文章

  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解 什么是位图? 位图,又称为比特图、Bitmap,是一种非常常用的数据结构。它是一种特殊的数组,只能存储0或1,可以用来表示一些二元状态,如二进制码、字符集、颜色等信息。在数据挖掘、工程设计、网络安全等领域都有广泛的应用。 位图的原理 位图的原理是用数据的位来表示某个元素对应的值。如果对应位为1,则代表该元素存在,否则代表该…

    数据结构 2023年5月17日
    00
  • Redis五种数据结构在JAVA中如何封装使用

    Redis 是一款高性能的键值存储数据库,支持五种不同的数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。在Java中使用Redis需要封装对应的数据结构,本文将详细介绍如何封装Redis的五种数据结构。 封装Redis字符串数据结构 Redis字符串数据结构对应Java中的String类…

    数据结构 2023年5月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

    算法与数据结构 2023年5月11日
    00
  • C语言树状数组的实例详解

    首先需要了解什么是树状数组。树状数组(Binary Indexed Tree,BIT),也叫做 Fenwick 树(树状数组的发明者是Peter M. Fenwick),是一个查询和修改复杂度都为 log(n) 的数据结构,与线段树类似,但使用起来比线段树更加方便以及简洁。 在该攻略中,我们将通过两条树状数组的实例,详细讲解树状数组,让读者更好地理解树状数组…

    数据结构 2023年5月17日
    00
  • c语言实现单链表算法示例分享

    下面是详细的攻略。 C语言实现单链表算法示例分享 什么是单链表 单链表是一种数据结构,它由一个个节点组成,每个节点包含两个部分:一个是数据部分,另一个是指针部分,指针部分指向下一个节点的位置。单链表的节点是动态分配的,可以随时插入、删除,是一种非常灵活的数据结构。 为什么要使用单链表 在进行一些操作时,数组或者普通的指针会遇到很多麻烦。比如在删除数组元素时,…

    数据结构 2023年5月17日
    00
  • Java数据结构之实现跳表

    Java数据结构之实现跳表,是一篇对跳表数据结构的详细讲解。 背景 跳表是一种基于有序链表的高效查找算法,它的查找时间复杂度为O(logn),相比于普通链表的O(n),具有很大的优势。本文将介绍跳表的实现过程。 实现跳表 1. 跳表结构体 跳表的数据结构体实现包含以下四项: 头结点head:表示链表的起始位置。 节点Node:跳表中的节点,包含表层链表和下层…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之单链表的实例详解

    Go语言数据结构之单链表的实例详解 简介 单链表是一个常见的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的引用。单链表的插入和删除操作比较容易,但是访问操作的效率相对较低。 在Go语言中,可以使用结构体配合指针来实现单链表。 实现思路 为了实现单链表,需要先定义一个节点结构体Node,包含一个value值和一个next指针。通过next指…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部