数据结构与算法基础-学习-03-线性表之链式表-初始化、销毁、清理、获取长度、判断为空、获取元素等实现
admin
2024-02-23 13:30:31
0

一、测试环境

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

二、函数介绍

1、初始化链式表数据层

(1)函数定义

Status InitElemType(ElemType *E)
{if(E == NULL){   printf("Pointer Is Null ,Exit !\n");exit(ExceptionExitFlag);}memset(E->StudentNum , '\0', sizeof(char) * StudentNumLen);memset(E->StudentName, '\0', sizeof(char) * StudentNameLen);E->StudentScore = 0;E->NextPointer  = NULL;printf("Init ElemType Success\n");PrintPretty();return SuccessFlag;
}

(2)参数说明

参数名说明
E需要初始化的链式表数据层。

2、初始化链式表

(1)函数定义

Status InitLinkList(LinkList *L)
{JudgePointerNull(L);//L = (LinkList *)MyMalloc(sizeof(LinkList));L->ElemArray = (ElemType *)MyMalloc(sizeof(ElemType));InitElemType(L->ElemArray);L->ElemArrayLen = 0;printf("Init LinkList Success\n");PrintPretty();return SuccessFlag;
}

(2)参数说明

参数名说明
L需要初始化的链式表。

3、判断链式表是否为空

(1)函数定义

int JudgeLinkListIsEmpty(LinkList *L)
{JudgePointerNull(L);if(L->ElemArrayLen == 0){printf("Link List Is Empty\n");PrintPretty();return SuccessFlag;}else{printf("Link List Is Not Empty\n");PrintPretty();return FailFlag;}
}

(2)参数说明

参数名说明
L需要判断非空的链式表指针。

4、销毁链式表

(1)函数定义

void DestroyLinkList(LinkList *L)
{printf("Start Destroy Link List\n");JudgePointerNull(L);ElemType *p = L->ElemArray;ElemType *q = NULL;while(p){q = p->NextPointer;printf("Free Pointer          : %p\n",p);free(p);p = q;}free(L);printf("Free Link List Pointer: %p\n",L);L = NULL;printf("Destroy Link List Success !!!\n");PrintPretty();
}

(2)参数说明

参数名说明
L需要销毁的链式表指针。

5、清理链式表数据层

(1)函数定义

Status ClearLinkListElem(LinkList *L)
{printf("Start Clear Link List Elem\n");JudgePointerNull(L);L->ElemArrayLen = 0;ElemType *p = L->ElemArray->NextPointer;ElemType *q = NULL;while(p){q = p->NextPointer;printf("Free Pointer          : %p\n",p);free(p);p = q;}L->ElemArray->NextPointer = NULL;printf("Clear Link List Elem Success !!!\n");PrintPretty();return SuccessFlag;
}

(2)参数说明

参数名说明
L需要清理的链式表指针。

6、获取链式表长度

(1)函数定义

int GetLinkListLen(LinkList *L)
{JudgePointerNull(L);printf("Get Link List Len     : %d\n",L->ElemArrayLen);PrintPretty();return L->ElemArrayLen;
}

(2)参数说明

参数名说明
L需要获取长度的链式表指针。

7、获取链式表元素

(1)函数定义

int GetLinkListElem(LinkList *L, int ElemPosition, ElemType *VarElem)
{JudgePointerNull(L);if(ElemPosition < 1 || ElemPosition > L->ElemArrayLen){printf("Error ElemPosition : %d, Need 1 <= ElemPosition <= ElemArrayLen(%d)\n",ElemPosition,L->ElemArrayLen);PrintPretty();return FailFlag;}int i;ElemType *p = L->ElemArray;for(i=1; i<=ElemPosition; i++){p = p->NextPointer;}VarElem = p;PrintElemType(VarElem);printf("ElemPosition          : %d ,Get Data Success\n",ElemPosition);PrintPretty();return SuccessFlag;
}

(2)参数说明

参数名说明
L需要获取元素的链式表指针。
ElemPosition需要获取元素的位置,大于等于1,小于等于链表最大长度(除头节点)。
VarElem需要获取元素的指针,如果找到数据,会把对应位置的数据写入到这个指针里。

三、测试代码

1、LinearTable_LinkList.c

#include 
#include 
#include 
#include "LinearTable_LinkList.h"void PrintPretty()
{printf("*********************************\n");
}void PrintPretty_V1()
{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(LinkList *L)
{if(!L){printf("Pointer Is Null ,Exit !\n");exit(ExceptionExitFlag);}
}Status InitElemType(ElemType *E)
{if(E == NULL){   printf("Pointer Is Null ,Exit !\n");exit(ExceptionExitFlag);}memset(E->StudentNum , '\0', sizeof(char) * StudentNumLen);memset(E->StudentName, '\0', sizeof(char) * StudentNameLen);E->StudentScore = 0;E->NextPointer  = NULL;printf("Init ElemType Success\n");PrintPretty();return SuccessFlag;
}Status InitLinkList(LinkList *L)
{JudgePointerNull(L);//L = (LinkList *)MyMalloc(sizeof(LinkList));L->ElemArray = (ElemType *)MyMalloc(sizeof(ElemType));InitElemType(L->ElemArray);L->ElemArrayLen = 0;printf("Init LinkList Success\n");PrintPretty();return SuccessFlag;
}void PrintLinkList(LinkList *L)
{printf("Print Link List\n");JudgePointerNull(L);printf("Link List Pointer     : %p\n",L);PrintPretty_V1();ElemType *p = L->ElemArray;while(p){printf("CurrentPointer        : %p\n",p);printf("StudentNum            : %s\n",p->StudentNum);printf("StudentName           : %s\n",p->StudentName);printf("StudentScore          : %d\n",p->StudentScore);printf("NextPointer           : %p\n",p->NextPointer);PrintPretty_V1();p = p->NextPointer;}printf("ElemArrayLen          : %d\n",L->ElemArrayLen);PrintPretty();
}void PrintElemType(ElemType *E)
{printf("Print Elem Type\n");if(!E){printf("Pointer Is Null ,Exit !\n");exit(ExceptionExitFlag);}printf("StudentNum            : %s\n",E->StudentNum);printf("StudentName           : %s\n",E->StudentName);printf("StudentScore          : %d\n",E->StudentScore);printf("NextPointer           : %p\n",E->NextPointer);PrintPretty();
}int JudgeLinkListIsEmpty(LinkList *L)
{JudgePointerNull(L);if(L->ElemArrayLen == 0){printf("Link List Is Empty\n");PrintPretty();return SuccessFlag;}else{printf("Link List Is Not Empty\n");PrintPretty();return FailFlag;}
}void DestroyLinkList(LinkList *L)
{printf("Start Destroy Link List\n");JudgePointerNull(L);ElemType *p = L->ElemArray;ElemType *q = NULL;while(p){q = p->NextPointer;printf("Free Pointer          : %p\n",p);free(p);p = q;}free(L);printf("Free Link List Pointer: %p\n",L);L = NULL;printf("Destroy Link List Success !!!\n");PrintPretty();
}Status ClearLinkListElem(LinkList *L)
{printf("Start Clear Link List Elem\n");JudgePointerNull(L);L->ElemArrayLen = 0;ElemType *p = L->ElemArray->NextPointer;ElemType *q = NULL;while(p){q = p->NextPointer;printf("Free Pointer          : %p\n",p);free(p);p = q;}L->ElemArray->NextPointer = NULL;printf("Clear Link List Elem Success !!!\n");PrintPretty();return SuccessFlag;
}int GetLinkListLen(LinkList *L)
{JudgePointerNull(L);printf("Get Link List Len     : %d\n",L->ElemArrayLen);PrintPretty();return L->ElemArrayLen;
}int GetLinkListElem(LinkList *L, int ElemPosition, ElemType *VarElem)
{JudgePointerNull(L);if(ElemPosition < 1 || ElemPosition > L->ElemArrayLen){printf("Error ElemPosition : %d, Need 1 <= ElemPosition <= ElemArrayLen(%d)\n",ElemPosition,L->ElemArrayLen);PrintPretty();return FailFlag;}int i;ElemType *p = L->ElemArray;for(i=1; i<=ElemPosition; i++){p = p->NextPointer;}VarElem = p;PrintElemType(VarElem);printf("ElemPosition          : %d ,Get Data Success\n",ElemPosition);PrintPretty();return SuccessFlag;
}

2、LinearTable_LinkList.h

#ifndef LinearTable_LinkList_H
#define LinearTable_LinkList_H#define ExceptionExitFlag -1
#define SuccessFlag        1
#define FailFlag           0
#define ElemArrayMaxLen   10
#define StudentNumLen      8
#define StudentNameLen     8typedef int Status;typedef struct ElemType
{char             StudentNum[StudentNumLen];char             StudentName[StudentNameLen];int              StudentScore;struct ElemType *NextPointer;
}ElemType;typedef struct 
{ElemType *ElemArray;int      ElemArrayLen;
}LinkList;void *MyMalloc(size_t size);
Status InitElemType(ElemType *E);
Status InitLinkList(LinkList *L);
void JudgePointerNull(LinkList *L);
void PrintLinkList(LinkList *L);
int JudgeLinkListIsEmpty(LinkList *L);
void DestroyLinkList(LinkList *L);
Status ClearLinkListElem(LinkList *L);
int GetLinkListLen(LinkList *L);
int GetLinkListElem(LinkList *L, int ElemPosition, ElemType *VarElem);
void PrintElemType(ElemType *E);void PrintPretty();
void PrintPretty_V1();
#endif

3、main.c

#include 
#include 
#include 
#include "LinearTable_LinkList.h"int main()
{LinkList *L = (LinkList *)MyMalloc(sizeof(LinkList));ElemType *VarElem = (ElemType *)MyMalloc(sizeof(ElemType));InitLinkList(L);PrintLinkList(L);GetLinkListElem(L, 1, VarElem);PrintElemType(VarElem);JudgeLinkListIsEmpty(L);GetLinkListLen(L);ClearLinkListElem(L);PrintLinkList(L);DestroyLinkList(L);L = NULL;return SuccessFlag;
}

4、makefile

CC = gcc
CFLAG_EXEC = -Wall -g
CFLAG_ALIAS = -o
RM_COMM = rm -rfall : mainmain : $(CC) $(CFLAG_EXEC) LinearTable_LinkList.c main.c $(CFLAG_ALIAS) Test_LinearTable_LinkListclean : $(RM_COMM) Test_LinearTable_LinkList

四、编译运行

[gbase@czg2 LinearTable_LinkList]$ make clean
rm -rf Test_LinearTable_LinkList[gbase@czg2 LinearTable_LinkList]$ make
gcc -Wall -g LinearTable_LinkList.c main.c -o Test_LinearTable_LinkList[gbase@czg2 LinearTable_LinkList]$ ./Test_LinearTable_LinkList 
Init ElemType Success
*********************************
Init LinkList Success
*********************************
Print Link List
Link List Pointer     : 0x16c0010
################
CurrentPointer        : 0x16c0060
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : (nil)
################
ElemArrayLen          : 0
*********************************
Error ElemPosition : 1, Need 1 <= ElemPosition <= ElemArrayLen(0)
*********************************
Print Elem Type
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : (nil)
*********************************
Link List Is Empty
*********************************
Get Link List Len     : 0
*********************************
Start Clear Link List Elem
Clear Link List Elem Success !!!
*********************************
Print Link List
Link List Pointer     : 0x16c0010
################
CurrentPointer        : 0x16c0060
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : (nil)
################
ElemArrayLen          : 0
*********************************
Start Destroy Link List
Free Pointer          : 0x16c0060
Free Link List Pointer: 0x16c0010
Destroy Link List Success !!!
*********************************

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...