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日

相关文章

  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之优先级队列(堆)

    Java深入了解数据结构之优先级队列(堆) 本文将会详细介绍Java中的优先级队列,即堆数据结构的实现过程和使用方法。 什么是优先级队列? 在介绍优先级队列之前,我们需要了解先进先出队列(FIFO Queue)和后进先出队列(LIFO Queue,或称栈)的概念。FIFO Queue按照元素的插入顺序依次出队;而LIFO Queue则按照元素的插入顺序反向出…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之判断一个链表是否为回文结构的方法

    当我们遇到判断一个链表是否为回文结构的问题时,可以考虑使用如下的方法: 遍历链表,将链表节点的值存储到一个数组或者栈中。 遍历链表,将链表节点的值与前面存储的值进行比较,如果全部相同,则证明链表为回文结构。 下面是详细的代码实现和示例说明: 实现 首先,我们需要定义一个链表节点的结构体,包括节点值和指向下一个节点的指针: struct ListNode { …

    数据结构 2023年5月17日
    00
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解 什么是顺序表 顺序表是一种线性表,它通过一块连续的存储空间来存储数据。顺序表中的数据元素排列在物理存储空间上也是连续的,每个元素占用一个固定的位置和大小,并且使用下标来访问。 顺序表的定义 下面是以int类型为例的一个简单顺序表的定义: #define SIZE 50 typedef struct { …

    数据结构 2023年5月17日
    00
  • 数据结构 红黑树的详解

    数据结构:红黑树的详解攻略 一、红黑树的定义 红黑树是一种二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树的特征是对于任何有效的红黑树,从根到叶子结点或空子结点的每条路径都包含相同数目的黑色结点。 二、插入操作 对于新插入的节点,将其涂红并插入红黑树中,然后按照二叉搜索树的规则将其插入到红黑树中。 如果父节点是黑色,则不需…

    数据结构 2023年5月17日
    00
  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • C语言中单链表的基本操作指南(增删改查)

    C语言中单链表的基本操作指南如下: 单链表 单链表是一种线性结构,具有链式存储的特点,即用指针相连的方式存储数据。单链表的每个节点包含一个数据域和一个指向下一个节点的指针域。单链表与数组相比,其插入和删除操作效率较高,但是查找效率较低。 在C语言中,可以使用结构体和指针实现单链表。如下所示,Node结构体表示单链表中的一个节点,包含一个数据成员和一个指向下一…

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

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

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