IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++-数组_顺序表-模块化实现 -> 正文阅读

[C++知识库]C/C++-数组_顺序表-模块化实现

C/C++ -顺序表-模块化实现

前言

链表-贯穿数据结构的基础,顺序表是其中之一。当使用c/c++实现这些数据结构的时候,我们使用指针相关内容,良好的指针基础是学好数据结构的关键。*在大多数的教科书中在初始化表时直接固定好了表长,本篇文章介绍的方法是动态开辟内存,这样做的好处是节省了内存开销。*那么我们在进行顺序表的编码前,首先进行c的几个库函数的学习:

malloc函数:申请一块连续的指定大小的的内存空间,默认值随机。
原型:void *malloc(unsigned int num_bytes);

calloc函数:申请一块连续的指定大小的内存空间,并将所有值默认为0,等价于malloc,效率比malloc低。
原型:void *calloc(size_t n, size_t size);

realloc函数:对已经申请的空间进行扩容。
原型:void realloc(void *ptr, size_t size);

这里只是对三种函数进行简单的介绍,在本篇文章中不会详细介绍,需要详细使用方法可以自行百度。

需求

初始化表 -> 将数据分别添加到 表a, 表b -> 合并 表a 和 表b ->输出结果;

顺序表原理

顺序表结构:

在这里插入图片描述

解释:定义结构体,包含顺序表指针 *elements,表中元素个数 count,表中空间长度 size(以一个数据类型为单位)。

// list.c

struct list {
    int *elements;  //元素数组
    int count;      //元素个数(长度)
    int size;       //空间长度
};

顺序表操作:

1.表初始化

struct list *list_init() // 初始化表
{
    // 表指空
    struct list *list = NULL;
    // 给list分配空间(初始化)
    list = (struct list *)malloc(sizeof(struct list));
    if(list == NULL) {
        return NULL;
    }
    // 为表的elements分配空间(初始化)
    list->elements = (int *)calloc(LIST_INIT_SIZE, sizeof(int));
    if(list->elements == NULL) {
        free(list);
        return NULL;
    }
    list->count = 0;
    list->size = 0;

    return list;
}

2.释放表

void list_free(struct list *list)
{
    free(list->elements);
    free(list);
    return;
}

3.清空表

void list_clear(struct list *list)
{
    list->count = 0;
    return;
}

4.判空

int list_isempty(struct list *list)
{
    return list->count == 0;
}

5.获取表长度

int list_count(struct list *list)
{
    return list->count;
}

6.获取元素

int list_get(struct list *list, int index)
{
    return list->elements[index];
}

7.设置元素

void list_set(struct list *list, int index, int element)
{
    list->elements[index] = element;
    return;
}

8.删除元素

int list_remove(struct list *list, int index)
{
    // 存储移除元素,最后返回
    int rm_element = list->elements[index];
    // 从index 开始,元素从后往前移动,elements长度减一
    for(int i = index; i < list->count - 1; i++) {
        list->elements[index] = list->elements[index + 1];
    }

    list->count--;
    return rm_element;
}

9.添加元素

void list_add(struct list *list, int index, int element)
{
    // 表满 ? 扩容 : 退出;
    if(list->count == list->size) {
        int *tmp = NULL;
        tmp = (int *)realloc(list->elements, sizeof(int)*(list->size + LIST_INIT_SIZE));
        if(tmp == NULL) {
            exit(EXIT_FAILURE);
        }

        list->elements = tmp;
        list->size += LIST_INIT_SIZE;
    }
	// 将index之后的元素后移
    for(int i = list->count - 1; i >= index; i--) {
        list->elements[i + 1] = list->elements[i];
    }

    list->elements[index] = element;
    list->count++;

    return;
}

自定义头文件 list.h

// list.h

struct list;
// 初始化表
struct list *list_init();
// 释放表
void list_free(struct list *list);
// 清空表
void list_clear(struct list *list);
// 判空
int list_isempty(struct list *list);
// 获取表长度,返回长度
int list_count(struct list *list);
// 获取元素,返回元素值
int list_get(struct list *list, int index);
// 设置元素
void list_set(struct list *list, int index, int element);
// 删除元素,返回删除元素
int list_remove(struct list *list, int index);
// 添加元素
void list_add(struct list *list, int index, int element);

mian.c

// main.c
    
int main()
{
    // 1.定义 list_a 和 list_b
    struct list *list_a = NULL;
    struct list *list_b = NULL;
    int flag;
    // 2.list_init()方法初始化 list_a 和 list_b, list_add()方法, 插入数据
    list_a = list_init();
    list_add(list_a, 0, 3);
    list_add(list_a, 0, 6);
    list_add(list_a, 0, 9);
    list_add(list_a, 0, 12);
    list_add(list_a, 0, 43);

    list_b = list_init();
    list_add(list_b, 0, 7);
    list_add(list_b, 0, 12);
    list_add(list_b, 0, 1);
    list_add(list_b, 0, 3);
    list_add(list_b, 0, 8);

    // 3.合并 list_a 和 list_b, 去重
    for(int i = 0; i < list_count(list_b); i++) {
        flag = 0;
        for(int j = 0; j < list_count(list_a); j++) {
            if(list_get(list_a, j) == list_get(list_b, i)) {
                flag = 1;
                break;
            }
        }
        if(flag == 0) {
            list_add(list_a, list_count(list_a), list_get(list_b, i));
        }
    }
	cout << "这是结果" << endl;
    // 4.输出结果,释放指针
    for(int i = 0; i < list_count(list_a); i++) {
        cout << list_get(list_a, i) << " ";
    }
    cout << endl;
    list_free(list_a);
    list_free(list_b);

    system("PAUSE");
    return 0;
}

时隔一年之后复习数据结构…计算机长路漫漫…

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:37:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 6:30:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码