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

一、测试环境

名称
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#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     8

typedef 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 -rf

all : main

main : 
	$(CC) $(CFLAG_EXEC) LinearTable_LinkList.c main.c $(CFLAG_ALIAS) Test_LinearTable_LinkList

clean : 
	$(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 !!!
*********************************
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值