数据结构与算法基础-学习-01-线性表之顺序表-初始化、销毁、清理、获取长度、判断为空、获取元素等实现

news2024/11/16 9:41:40

一、测试环境

名称
cpu12th Gen Intel® Core™ i7-12700H
操作系统CentOS Linux release 7.9.2009 (Core)
内存3G
逻辑核数2
gcc 版本4.8.5 20150623

二、个人理解

数据结构分为逻辑结构和物理结构(也称为存储结构)。

1、逻辑结构

逻辑结构又可以分为以下四种结构。

(1)集合结构

例如:{1,2,3,5,6},这里面的元素除了属于一个相同的集合外,各个元素之间没有任何联系。

(2)线性结构

例如:(a)-(b)-(c),a是b的“直接前驱”,b是a的“直接后继”。相邻元素之间是有一定的关系存在,且是一对一的。

(3)树形结构

结构中的各个元素之间存在一对多的关系,图不好画,bing一个,例如:
在这里插入图片描述

(4)图结构

结构中的数据元素是多对多的关系,图不好画,bing一个,例如:
在这里插入图片描述

2、物理结构

物理结构分为两种。

(1)顺序结构

顺序存储结构是把数据元素存放在一组地址连续的存储单元里,其数据元素间的逻辑关系和物理关系是一致的。
编写C代码时,用数组的方式实现。

(2)链式结构

链式存储结构是把数据元素存放在任意的存储单元里,这些存储单元可以是连续的,也可以是不连续的,数据元素的物理关系并不能反映其逻辑关系,因此需要借助指针来表示数据元素之间的逻辑关系。
编写C代码时,用链表的方式实现。

三、代码

1、LinearTable_OrderTable.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LinearTable_OrderTable.h"

void PrintPretty()
{
    printf("*********************************\n");
}

void *MyMalloc(size_t size)
{
    void *Result = (void *)malloc(size);
    if(Result == NULL)
    {
        printf("malloc Function Exec Fail , Out Of Memory ,Exit!!!\n");
        exit(ExceptionExitFlag);
    }
    return Result;
}

void JudgePointerNull(OrderTable *OrderTablePointer)
{
    if(OrderTablePointer == NULL)
    {
        printf("Pointer Is Null ,Exit !\n");
        exit(ExceptionExitFlag);
    }
}

Status InitOrderTable(OrderTable *OrderTablePointer)
{
    printf("Start Init List\n");
    JudgePointerNull(OrderTablePointer);
    OrderTablePointer->ElemArray    = (ElemType *)MyMalloc(sizeof(ElemType) * ElemArrayMaxLen);
    memset(OrderTablePointer->ElemArray, '\0', sizeof(ElemType) * ElemArrayMaxLen);
    OrderTablePointer->ElemArrayLen = 0;
    printf("Init List Success !!!\n");
    PrintPretty();
    return SuccessfulFlag;
}

void DestroyOrderTable(OrderTable *OrderTablePointer)
{
    printf("Start Destroy List\n");
    JudgePointerNull(OrderTablePointer);
    free(OrderTablePointer->ElemArray);
    OrderTablePointer->ElemArray = NULL;
    free(OrderTablePointer);
    OrderTablePointer = NULL;

    printf("Destroy List Success !!!\n");
    PrintPretty();
}

void PrintOrderTable(OrderTable *OrderTablePointer)
{
    printf("Print List\n");
    JudgePointerNull(OrderTablePointer);
    int i;
    printf("ElemArray    : ");
    for(i=0; i<ElemArrayMaxLen -1; i++)
    {
        printf("%c ,",OrderTablePointer->ElemArray[i]);
    }
    printf("%c \n",OrderTablePointer->ElemArray[i]);
    printf("ElemArrayLen : %d\n",OrderTablePointer->ElemArrayLen);
    PrintPretty();
}

void ClearOrderTable(OrderTable *OrderTablePointer)
{
    printf("Clear Order Table\n");
    JudgePointerNull(OrderTablePointer);
    OrderTablePointer->ElemArrayLen = 0;
    PrintPretty();
}

int GetOrderTableLen(OrderTable *OrderTablePointer)
{
    JudgePointerNull(OrderTablePointer);
    printf("Get ElemArray Len : %d\n",OrderTablePointer->ElemArrayLen);
    PrintPretty();
    return OrderTablePointer->ElemArrayLen;
}

int JudgeOrderTableIsEmpty(OrderTable *OrderTablePointer)
{
    JudgePointerNull(OrderTablePointer);
    if(OrderTablePointer->ElemArrayLen == 0)
    {
        printf("Order Table Is Empty\n");
        PrintPretty();
        return SuccessfulFlag;
    }
    else
    {
        printf("Order Table Is Not Empty\n");
        PrintPretty();
        return FailFlag;
    }
}

int GetOrderTableElem(OrderTable *OrderTablePointer, int ElemPosition, ElemType *VarElem)
{
    JudgePointerNull(OrderTablePointer);
    if(ElemPosition < 1 || ElemPosition > OrderTablePointer->ElemArrayLen)
    {
        printf("Error ElemPosition : %d, Need 1 <= ElemPosition <= ElemArrayLen(%d)\n",ElemPosition,OrderTablePointer->ElemArrayLen);
        PrintPretty();
        return FailFlag;
    }
    
    *VarElem = OrderTablePointer->ElemArray[ElemPosition-1];
    printf("Get  ElemPosition : %d Elem Successful\n",ElemPosition);
    PrintPretty();
    return SuccessfulFlag;
}

2、LinearTable_OrderTable.h

#ifndef LinearTable_OrderTable_H
#define LinearTable_OrderTable_H

#define ExceptionExitFlag -1
#define SuccessfulFlag     1
#define FailFlag           0
#define ElemArrayMaxLen   10

typedef int Status;
typedef char ElemType;
typedef struct 
{
    ElemType *ElemArray;
    int      ElemArrayLen;
}OrderTable;

void *MyMalloc(size_t size);
void PrintOrderTable(OrderTable *OrderTablePointer);
Status InitOrderTable(OrderTable *OrderTablePointer);
void DestroyOrderTable(OrderTable *OrderTablePointer);
void JudgePointerNull(OrderTable *OrderTablePointer);
void ClearOrderTable(OrderTable *OrderTablePointer);
int GetOrderTableLen(OrderTable *OrderTablePointer);
int JudgeOrderTableIsEmpty(OrderTable *OrderTablePointer);
int GetOrderTableElem(OrderTable *OrderTablePointer, int ElemPosition, ElemType *VarElem);

void PrintPretty();

#endif

3、main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LinearTable_OrderTable.h"

int main()
{
    ElemType *VarElem = NULL;

    OrderTable *TestData = (OrderTable *)MyMalloc(sizeof(OrderTable));;
    InitOrderTable(TestData);
    PrintOrderTable(TestData);
    ClearOrderTable(TestData);
    GetOrderTableLen(TestData);
    JudgeOrderTableIsEmpty(TestData);
    GetOrderTableElem(TestData, 1, VarElem);
    DestroyOrderTable(TestData);
    return SuccessfulFlag;
}

4、makefile

CC = gcc
CFLAG_O = -c -Wall -fpic -O3
CFLAG_SO = -shared
CFLAG_EXEC = -Wall -O3
CFLAG_ALIAS = -o
RM_COMM = rm -rf
SRC_PATH = ../test_src/
EXEC_PATH = ../exec/
TEMP_PATH = ../temp/
INCLUDE_COMMAND = -I
LIB_COMMAND = -L
INCLUDE_PATH = ../include/
LIB_PATH = ../lib/
LIB_NAME = -l

#gcc -g -Wall LinearTable_OrderTable.c main.c -o Test_LinearTable_OrderTable 

all : main

main : 
        $(CC) $(CFLAG_EXEC) LinearTable_OrderTable.c main.c $(CFLAG_ALIAS) Test_LinearTable_OrderTable 

clean : 
        $(RM_COMM) Test_LinearTable_OrderTable

四、编译运行

[gbase@czg2 LinearTable_OrderTable]$ make clean
rm -rf Test_LinearTable_OrderTable

[gbase@czg2 LinearTable_OrderTable]$ make
gcc -Wall -O3 LinearTable_OrderTable.c main.c -o Test_LinearTable_OrderTable 

[gbase@czg2 LinearTable_OrderTable]$ ./Test_LinearTable_OrderTable 
Start Init List
Init List Success !!!
*********************************
Print List
ElemArray    :  , , , , , , , , , 
ElemArrayLen : 0
*********************************
Clear Order Table
*********************************
Get ElemArray Len : 0
*********************************
Order Table Is Empty
*********************************
Error ElemPosition : 1, Need 1 <= ElemPosition <= ElemArrayLen(0)
*********************************
Start Destroy List
Destroy List Success !!!
*********************************

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python学习笔记(09)---(正则表达式)

第七章 内置容器&#xff08;五&#xff09; 8.正则表达式 &#xff08;1&#xff09;正则表达式用于描述字符串的复杂文本规则的代码&#xff0c;一般用于查询匹配 &#xff08;2&#xff09;常见元字符 <1> 作用&#xff1a;表示特殊含义&#xff0c;一般为范围性…

MySQL数据库期末考试试题及参考答案(09)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 MySQL提供的____命令可以将数据库导出成SQL脚本&#xff0c;以实现数据的备份。mysqldump命令备份多个数据库时&#xff0c;数据库名称之间用____隔开。MySQL中…

Java-1123

Jedis 介绍&#xff1a;Jedis是一款java操作redis数据库的工具&#xff08;类似JDBC&#xff09; 使用步骤&#xff1a; 下载jedis的jar包使用 快速入门 // 1.获取连接 Jedis jedis new Jedis("localhost",6379); // 2.操作 jedis.set("name","z…

c++ 深度拷贝和浅拷贝

一、简介 由于20年转行之后一直用的是halcon 和c# &#xff0c;C就此搁浅&#xff0c;最近开始搞pcl慢慢的又重拾起来&#xff0c;对于深拷贝和浅拷贝我知道是什么原因造成的&#xff0c;也知道如何解决&#xff0c;但是突然被人问得时候又有点蒙蔽&#xff0c;因此做一个简单…

MCE 天然化合物相关库更新

随着现代化合物分离和鉴定技术的不断提高&#xff0c;以及人们对自然界生物多样性的持续研究&#xff0c;越来越多的天然产物被用于新药研究开发。据统计&#xff0c;截至 2013 年&#xff0c;有 547 个天然产物及天然产物衍生物被 FDA 批准上市&#xff0c;占所有 FDA 批准上市…

高通骁龙处理器天梯排行榜2022 骁龙处理器发布时间排行

骁龙处理器天梯图2022最新10月更新榜单 1、高通骁龙8 Gen1 2、高通骁龙8 Gen1 3、高通骁龙888 Plus 4、高通骁龙888 我用的手机就是活动时7.5折抢购的 点击开抢 http://shouji.adiannao.cn/7 1、工艺&#xff1a;搭载最新一代5nm制作工艺&#xff0c;为用户带来最强的处理器性能…

[附源码]Python计算机毕业设计大学生兼职系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

STM32中的独立看门狗和窗口看门狗

独立看门狗和窗口看门狗有什么区别&#xff1f;一、前言二、独立看门狗三、窗口看门狗四、结语一、前言 在早期的MCU中是没有看门狗这种东西的&#xff0c;所以产品就很容易出现死机&#xff0c;跑飞的情况。为了避免这种情况的出现&#xff0c;后期的MCU都集成了看门狗的功能…

CI/CD Jenkins容器化安装部署

环境准备 docker安装 jenkins镜像安装 CI/CD CI:持续集成 CD:连续交付 环境准备 下载前推荐先看下Jenkins硬件和软件要求部分 Jenkins官方文档 Jenkins下载 虚拟机 docker 对配置的要求 CentOS安装可跳转 VMware安装CentOS CentOS 7.8 // 查看CentOS版本命令 cat /etc…

牛客网语法篇练习循环控制(一)

1.2023年就要来到了&#xff0c;KiKi要对他的n位好朋友说n遍”Happy new year!Good luck!”的祝福语。 n int(input()) for i in range(n):print(Happy new year!Good luck!) 2.任意输入一个正整数N&#xff0c;统计1~N之间奇数的个数和偶数的个数&#xff0c;并输出。 num …

【网页设计】基于HTML在线商城购物项目设计与实现-----电脑商城6页带视频 带报告3000字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#…

java开发者工具IDEA自定义设置主题/字体/字号大小

IDEA自定义设置主题 第一步&#xff1a;点击工具栏上的“File”选项。 第二步&#xff1a;选择“Settings…”选项。 第三步&#xff1a;点击“Appearance & Behavior > Appearance”选项。 第四步&#xff1a;点击右侧"Theme"下拉框&#xff0c;选择自己喜…

动态爬虫管理平台构建与实现_kaic

目 录 第1章 绪论 1.1背景与意义 1.2主题网络爬虫的国内外研究现状 1.2.1主题辨别算法及平台构建 1.2.2主题爬虫系统 1.3本文的研究内容 第二章 主题网络爬虫的体系结构 2.1组成模块 2.1.1基本组成 2.1.2基本流程 2.2主题页面的分布特性 2.2.1 Hub/Authority特性 2.2.2 Linkag…

一篇文章带你搞懂前端Cookie

文章目录一. 前言(一些废话)二. Cookie1. 为什么会有Cookie2. Cookie的特性3. 浏览器Cookie4. 跨站和跨域三. Cookie操作1. 获取Cookie2. 设置Cookie3. 修改Cookie4. 删除Cookie四. Cookie属性1. Cookie属性Domain2. Cookie属性path3. Cookie属性expires4. Cookie属性max-age5.…

大数据_数据中台_数据分层

目录 分层总览 ODS:操作数据层 DIM:维度数据层 DWD:明细数据层 DWS:汇总数据层 ADS:数据应用层 CDM:公共数据层 数据层级调用原则 分层总览 ODS:操作数据层 ODS(Operate Data Store&#xff09;,ODS层数据是数据仓库的第一层数据&#xff0c;是业务数据库的原始数据的复…

Oracle Primavera Unifier uDesigner 资产管理器(Asset Manager )

目录 前言 特点 优势 维护管理 独立或集成 事务管理 资产组合管理 投资组合管理能力 可持续性和能源管理 单一集成设施和资产生命周期管理 移动应用 前言 Oracle Primavera Unifier 为组织提供设施管理的行业最佳实践解决方案。从设计、构建、运行和维护&#xff0…

【深入理解Kotlin协程】Google的工程师们是这样理解Flow的?

Question&#xff1a;why there is a Flow in kotlin? 问这个问题就好比在问为什么那里会有一座山存在&#xff0c;嗯&#xff0c;这貌似是一个哲学问题。当然&#xff0c;对于kotlin中的Flow的理解可能不会上升到这么高的哲学层次&#xff0c;对于Flow相关的Api掌握并使用它…

JavaSE笔记——多态

文章目录前言一、向上转型回顾1.忘掉对象类型二、转机1.方法调用绑定2.产生正确的行为3.可扩展性三、构造器和多态1.构造器调用顺序2.构造器内部多态方法的行为四、协变返回类型总结前言 本文是学习Java编程思想记录的笔记&#xff0c;主要内容介绍在 Java 中多态的概念。 多…

Servlet API(HttpSerrvlet+HttpServletRequest+HttpServletResponse)

目录 &#x1f432; 1. HttpServlet &#x1f432; 2. HttpServletRequest HTTP请求 &#x1f984; 2.1 打印请求信息(创建 ShowRequest 类) &#x1f984; 2.2 获取 GET 请求中的参数(创建 GetParameter 类) &#x1f984; 2.3 获取 POST 请求中的参数(创建 PostParame…

java学习day57(Spring Cloud)Spring Cloud 微服务

主要课程内容 第⼀部分&#xff1a;微服务架构 互联网应用架构演进 微服务架构的体现思想及优缺点 微服务架构的核心概念 第⼆部分&#xff1a;SpringCloud概述 Sping Cloud 是什么 Sping Cloud 解决什么问题 Sping Cloud 架构 第三部分&#xff1a;案例准备 第四部分&#xff…