首页 > 其他分享 >数据结构 - 线性表 - 顺序表

数据结构 - 线性表 - 顺序表

时间:2024-03-31 20:34:34浏览次数:19  
标签:顺序 线性表 int SeqList -- length 数据结构 data

前言

最近刚刚开始复习408数据结构,就想着把每个章节的代码部分汇总记录一下,写成一组文章,便于日后的复习和参考。

本系列整体的框架和课后习题参考了王道的复习指导。在本系列的每篇文章中,我会先把该章节所对应数据结构的基础代码放上来,然后附上参考资料习题对应的题目代码。

线性表介绍

第一章的绪论没有涉及到具体数据结构的程序编写,我们在这里就暂时跳过。从第二章中的线性表开始介绍。首先贴一下本章的整体框架:

线性表
|
|--顺序存储
|  |--顺序表
|
|--链式存储
|  |--单链表(指针实现)
|  |--双链表(指针实现)
|  |--循环链表(指针实现)
|  |--静态链表(数组实现)

线性表(Linear List)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表按照存储结构可分为顺序表和各种链表,本篇文章介绍其中顺序表的实现与其操作算法的编写。

顺序表代码实现

#include <stdio.h>
#include <iostream>
#include <limits.h>
using namespace std;

#define INIT_SIZE 10
#define DEBUG 1

typedef int ElemType;

typedef struct {
    ElemType* data;
    int length;
    int capacity;
} SeqList;

void init(SeqList &l) {
    l.data = (ElemType*) malloc(sizeof (ElemType) * INIT_SIZE);
    l.length = 0;
    l.capacity = INIT_SIZE;
}

void expand(SeqList &l, int target_size) {
    // Re-allocate a larger area for the list
    auto new_cap = l.capacity << 1;
    while (target_size > new_cap) {
        new_cap = new_cap << 1;
    }
    l.capacity = new_cap;

    if (DEBUG) {
        cout << "Expanding list to " << new_cap << " bytes" << endl;
    }

    auto new_data = (ElemType*) malloc(sizeof (ElemType) * new_cap);
    // Copy the array contents
    memcpy(new_data, l.data, sizeof (ElemType) * l.length);
    // Free previously used memory
    free(l.data);
    l.data = new_data;
}

void insert(SeqList &l, ElemType value, int pos) {
    if (pos > l.length || pos < 0) { // It is ok to insert at [l.length]
        cout << "Trying to insert at " << pos << " (Len: " << l.length << ")" << endl;
        
        return;
    }

    int new_len = l.length + 1;

    if (new_len > l.capacity) {
        expand(l, new_len);
    }

    for (int i = l.length - 1; i >= pos; i--) {
        l.data[i + 1] = l.data[i];
    }

    l.data[pos] = value;
    l.length = new_len;
}

void remove(SeqList &l, int pos) {
    if (pos >= l.length || pos < 0) { // It is NOT ok to remove at [l.length]
        cout << "Trying to remove at " << pos << " (Len: " << l.length << ")" << endl;
        
        return;
    }

    int new_len = l.length - 1;

    for (int i = pos; i < new_len; i++) {
        l.data[i] = l.data[i + 1];
    }

    l.length = new_len;
}

void print(SeqList &l) {
    for (int i = 0; i < l.length; i++) {
        cout << l.data[i] << ' ';
    }
    cout << endl;
}

void print_size(SeqList &l) {
    cout << "Len: " << l.length << ", Cap: "<< l.capacity << endl;
}

顺序表综合应用

[01] 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出。

// Chap 2. 01
ElemType remove_min(SeqList &l) {
    if (l.length == 0) {
        cout << "List is empty" << endl;
    }

    ElemType cur_min = INT_MAX;
    auto min_pos = -1;

    for (int i = 0; i < l.length; i++) {
        if (l.data[i] < cur_min) {
            min_pos = i;
            cur_min = l.data[i];
        }
    }

    l.data[min_pos] = l.data[l.length - 1];
    l.length -= 1;

    return cur_min;
}

[02] 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

// Chap 2. 02
void rev(SeqList &l) {
    int i = 0;

    // 右移一个bit就是除以2
    // 奇数的话直接把0.5抹掉,正中间的元素不需要动
    while (i < (l.length >> 1)) {
        auto t = l.data[i];
        l.data[i] = l.data[l.length - 1 - i];
        l.data[l.length - 1 - i] = t;

        i++;
    }
}

[03] 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除所有值为x的数据元素。

// Chap 2. 03
void remove_all(SeqList &l, ElemType value) {
    int rm_cnt = 0;

    for (int i = 0; i < l.length; i++) {
        if (l.data[i] == value) {
            rm_cnt++;
        } else {
            l.data[i - rm_cnt] = l.data[i];
        }
    }

    l.length -= rm_cnt;
}

标签:顺序,线性表,int,SeqList,--,length,数据结构,data
From: https://www.cnblogs.com/devbobcorn/p/18107154

相关文章

  • 数据结构_包装类&泛型
    目录一、包装类1.1基本数据类型和对应的包装类1.2装箱和拆箱1.3拓展 二、泛型2.1引出泛型2.2泛型的语法及使用2.3泛型是如何编译的2.3.1擦除机制2.4泛型的上界2.5泛型方法总结一、包装类在Java中,由于基本类型不是继承自Object类,为了在泛型代码中......
  • web前端之页面逐渐呈现代码功能、对象数据如何获取下一个值、创建元素并添加id与类名
    MENU前言style(全部代码)JavaScript(核心代码)html(基本代码)前言1、效果演示以视频为准,暂未录视频(敬请期待);2、私信或微信可获取完整代码(WX:MJ682517)style(全部代码)*{margin:0;padding:0;box-sizing:border-box;}::-webkit-scrol......
  • 调试逻辑及变量声明顺序
    模型功能使用ILA观察信号观察变量的转化触发信号的设立ILA调试状态机的编写VIO的手动控制模型框图ila_0u_ila_0(.clk(clk),.probe0(probe_0));实现步骤ILA调试核的使用直接调用该IP核,可以实现一个在线逻辑分析仪的功能ILA核的设置包括信号个数(对应位宽......
  • 数据结构-C语言描述(队列的链表实现)
    概述在日常生活中,先进先出似乎更加符合我们的日常认知。 排队的人群中,队首的人总是先离开,而队尾的人总是后离开。1.队列的基本原理和操作我们知道队列也是一种线性表,而今天我们就用非顺序储存结构(链表)来实现它。首先我们先明确队列的基本操作原理:因为同时涉及到队首和队......
  • 【数据结构与算法篇】动态顺序表及相关OJ算法题
    【数据结构与算法篇】动态顺序表及相关OJ算法题......
  • 数据结构之结构体进阶——pair
    前言:当结构体中只有两个元素时,去定义结构体时太过于繁琐了,在C++中有特定的函数可以简化这种结构体的定义。 pair的定义:有两个元素的结构体,其中为first,second元素,其中first,second的类型可以自己定义。 pair的创建:文字解释:官方给予的定义:template<classT1,class......
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录广度优先+双分裂蛇广度优先+双分裂蛇双分裂蛇:是求二维表中从起点到终点的经典思路(也是......
  • java数据结构与算法刷题-----LeetCode95. 不同的二叉搜索树 II
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录分治回溯+记忆化搜索分治回溯+记忆化搜索卡特兰数,例如对于n个进栈元素,有多少种出栈顺序,......
  • Python 潮流周刊第 44 期(摘要)+ 赠书 5 本《明解Python算法与数据结构》
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2024-03-30-weekly特别提醒:本期赠书5......
  • Java顺序查找知识点(含面试大厂题和源码)
    顺序查找(SequentialSearch),也称为线性查找,是一种简单直观的查找算法。它通过逐个检查数据集中的每个元素来查找目标值。顺序查找不要求数据集是有序的,因此它适用于任何形式的数据集,包括数组、链表、列表等。顺序查找的工作原理:开始查找:从数据集的起始位置开始。逐个比较:将......