数据结构与算法基础-学习-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 !!!
*********************************

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...