一、测试环境
名称 值 cpu 12th 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)参数说明
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)参数说明
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)参数说明
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)参数说明
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)参数说明
6、获取链式表长度
(1)函数定义
int GetLinkListLen(LinkList *L)
{JudgePointerNull(L);printf("Get Link List Len : %d\n",L->ElemArrayLen);PrintPretty();return L->ElemArrayLen;
}
(2)参数说明
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 !!!
*********************************