数据结构与算法基础-学习-06-线性表之创建循环链表、创建尾指针循环链表、两个尾指针循环链表连接

news2024/11/23 9:43:00

一、测试环境

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

二、个人理解

1、循环链表优点

无论指针指向哪个节点,都可以访问任何一个其他节点。

2、尾指针循环链表优点

同上,加上一个优点:访问尾节点的时间复杂度为O(1)。

3、两个尾指针循环链表合并

合并尾指针循环链表L,L1步骤:
(1)让L的指针域指向L1的首元节点。

(2)L1的指针域指向L的头节点。

(3)删除L1的头节点。
在这里插入图片描述
突然发现自己的画画水平还可以,嘿嘿。

三、函数介绍

线性表之链式表的相关函数包括之前篇章《数据结构与算法基础-学习-05-线性表之链式表-删除元素、头插法创建单链表、尾插法创建单链表等实现》写的,都以此最新的篇幅为准。

1、CreateCycleLinkList

(1)用途

创建循环链表。

(2)函数定义

Status CreateCycleLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("Cycle Link List Len Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Cycle Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *CurNode = L->ElemArray;
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        CurNode->NextPointer = InsertElem;
        CurNode              = InsertElem;
        (L->ElemArrayLen)++;
    }
    CurNode->NextPointer = L->ElemArray;
    printf("Create Empty Cycle Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

(3)参数说明

参数名说明
L需要创建的循环链表指针。
LinkListLen初始化的数据节点长度。

2、CreateCycleTailLinkList

(1)用途

创建尾指针循环链表。

(2)函数定义

Status CreateCycleTailLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("Cycle Tail Link List Len Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Cycle Tail Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *CurNode = L->ElemArray;
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        CurNode->NextPointer = InsertElem;
        CurNode              = InsertElem;
        (L->ElemArrayLen)++;
    }
    CurNode->NextPointer = L->ElemArray;
    L->ElemArray         = CurNode;
    L->ElemArrayLen      = LinkListLen;
    printf("Create Empty Cycle Tail Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

(3)参数说明

参数名说明
L需要创建的尾指针循环链表指针。
LinkListLen初始化的数据节点长度。

3、UpdateCycleTailLinkListElem

(1)用途

更新尾指针循环链表数据节点。

(2)函数定义

Status UpdateCycleTailLinkListElem(LinkList *L, int Position, ElemType UpdateElem)
{
    JudgePointerNull(L);
    if(Position < 1 || Position > L->ElemArrayLen)
    {
        printf("Position Need >= 1 and <= %d\n",L->ElemArrayLen);
        return FailFlag;
    }
    if(Position == L->ElemArrayLen)
    {
        CopyElemTypeDataNoNextP(L->ElemArray, &UpdateElem);
        printf("Update Cycle Tail Link List Elem Success\n");
        return SuccessFlag;
    }
    int i;
    ElemType *TmpNode = L->ElemArray->NextPointer;
    for(i=1; i<= Position; i++)
    {
        TmpNode = TmpNode->NextPointer;
    }
    CopyElemTypeDataNoNextP(TmpNode, &UpdateElem);
    printf("Update Cycle Tail Link List Elem Success\n");
    PrintPretty();
    return SuccessFlag;
}

(3)参数说明

参数名说明
L需要更新尾指针循环链表指针。
Position需要更新尾指针循环链表的数据位置。
UpdateElem需要更新的数据。

4、Connect2CycleTailLinkList

(1)用途

两个尾指针循环链表连接。

(2)函数定义

LinkList *Connect2CycleTailLinkList(LinkList *L1, LinkList *L2)
{
    JudgePointerNull(L1);
    JudgePointerNull(L2);
    printf("Connect 2 Cycle Tail Link List ");
    LinkList *NewCTLinkList     = (LinkList *)MyMalloc(sizeof(LinkList));
    //NewCTLinkList->ElemArray    = (ElemType *)MyMalloc(sizeof(ElemType));
    NewCTLinkList->ElemArrayLen = (L1->ElemArrayLen) + (L2->ElemArrayLen);
    NewCTLinkList->ElemArray    = L2->ElemArray;
    ElemType *L1Head            = L1->ElemArray->NextPointer;
    ElemType *L2Head            = L2->ElemArray->NextPointer;
    L2->ElemArray->NextPointer  = L1Head;
    L1->ElemArray->NextPointer  = L2Head->NextPointer;

    free(L2Head);
    L1->ElemArray = NULL;
    L2->ElemArray = NULL;
    L1->ElemArrayLen = 0;
    L2->ElemArrayLen = 0;
    printf("Success \n");
    PrintPretty();
    return NewCTLinkList;
}

(3)参数说明

参数名说明
L1需要连接的尾指针循环链表指针。
L 2需要连接的尾指针循环链表指针。

四、测试代码

1、LinearTable_LinkList.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.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);
    }
}

void JudgeElemTypePointerIsNull(ElemType *E)
{
    if(!E)
    {
        printf("Pointer Is Null ,Exit !\n");
        exit(ExceptionExitFlag);
    }
}

Status InitElemType(ElemType *E)
{
    JudgeElemTypePointerIsNull(E);
    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;
        if(p == L->ElemArray)
        {
            printf("Cycle Link List Printf End\n");
            break;
        }
    }
    printf("ElemArrayLen          : %d\n",L->ElemArrayLen);
    PrintPretty();
}

void PrintElemType(ElemType *E)
{
    printf("Print Elem Type\n");
    JudgeElemTypePointerIsNull(E);
    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;
        free(p);
        //printf("Free Pointer          : %p\n",p);
        p = q;
        if(p == L->ElemArray)
        {
            printf("Cycle Link List ");
            break;
        }
    }
    L->ElemArrayLen = 0;
    free(L);
    //printf("Free Link List Pointer: %p\n",L);
    L = NULL;
    printf("Destroy 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;
}

Status CopyElemTypeData(ElemType *Dest, ElemType *Src)
{
    strcpy(Dest->StudentNum,Src->StudentNum);
    strcpy(Dest->StudentName,Src->StudentName);
    Dest->StudentScore = Src->StudentScore;
    Dest->NextPointer  = Src->NextPointer;
    return SuccessFlag;
}

Status CopyElemTypeDataNoNextP(ElemType *Dest, ElemType *Src)
{
    strcpy(Dest->StudentNum,Src->StudentNum);
    strcpy(Dest->StudentName,Src->StudentName);
    Dest->StudentScore = Src->StudentScore;
    return SuccessFlag;
}

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;
    }
    CopyElemTypeData(VarElem,p);
    //PrintElemType(VarElem);
    printf("ElemPosition          : %d ,Get Data Success\n",ElemPosition);
    PrintPretty();
    return SuccessFlag;
}

Status CmpElemType(ElemType *E1, ElemType *E2)
{
    //printf("Compare Struct ElemType\n");
    JudgeElemTypePointerIsNull(E1);
    JudgeElemTypePointerIsNull(E2);
    if(strcmp(E1->StudentNum,E2->StudentNum) != 0)
    {
        return FailFlag;
    }
    if(strcmp(E1->StudentName,E2->StudentName) != 0)
    {
        return FailFlag;
    }
    if((E1->StudentScore) != (E2->StudentScore))
    {
        return FailFlag;
    }
    return SuccessFlag;
}

ElemType * LocateElemPointer(LinkList *L, ElemType E)
{
    printf("Locate Element Pointer\n");
    JudgePointerNull(L);
    ElemType *p = L->ElemArray->NextPointer;
    int i = 0;
    while(p)
    {
        if(CmpElemType(p,&E) == SuccessFlag)
        {
            i++;
            printf("Pointer               : %p\n",p);
            printf("Locate Link List Elem Success\n");
            PrintPretty();
            return p;
        }
        p = p->NextPointer;
        i++;
    }
    if(i != L->ElemArrayLen)
    {
        printf("ElemArrayLen != Actual Link List Len, Exception Exit!!!\n");
        exit(ExceptionExitFlag);
    }
    printf("Locate Link List Elem Fail!!!\n");
    PrintPretty();
    return NULL;
}

int LocateElemPosition(LinkList *L, ElemType E)
{
    printf("Locate Element Position\n");
    JudgePointerNull(L);
    ElemType *p = L->ElemArray->NextPointer;
    int i = 0;
    while(p)
    {
        if(CmpElemType(p,&E) == SuccessFlag)
        {
            i++;
            printf("Position              : %d\n",i);
            printf("Locate Link List Elem Success\n");
            PrintPretty();
            return i;
        }
        p = p->NextPointer;
        i++;
    }
    if(i != L->ElemArrayLen)
    {
        printf("ElemArrayLen != Actual Link List Len, Exception Exit!!!\n");
        exit(ExceptionExitFlag);
    }
    printf("Locate Link List Elem Fail!!!\n");
    PrintPretty();
    return 0;
}
//Status InsertLinkListElem(LinkList *L, int ElemPosition, ElemType *VarElem)
//在插入数据时,不能直接用传入参数VarElem对链表L进行指针赋值,也就是注释掉的两行,会导致后续ClearLinkListElem执行时,提示:double free or corruption (out)。
//ClearLinkListElem代码中并没有多次free,改为注释两行上面的五行,问题得到解决。
Status InsertLinkListElem(LinkList *L, int ElemPosition, ElemType VarElem)
{
    JudgePointerNull(L);
    //printf("ElemPosition : %d\n",ElemPosition);
    //PrintElemType(VarElem);
    if(ElemPosition < 1 || ElemPosition > L->ElemArrayLen + 1)
    {
        printf("Error ,Need 1 <= ElemPosition <= %d\n",L->ElemArrayLen + 1);
        PrintPretty();
        return FailFlag;
    }
    int i = 0;
    ElemType *p = L->ElemArray;
    while(p)
    {
        if(i == ElemPosition - 1)
        {
            break;
        }
        p = p->NextPointer;
        i++;
    }

    ElemType *TmpElem = (ElemType *)MyMalloc(sizeof(ElemType));
    InitElemType(TmpElem);
    CopyElemTypeData(TmpElem,&VarElem);
    TmpElem->NextPointer = p->NextPointer;
    p->NextPointer = TmpElem;

    //(VarElem->NextPointer) = (p->NextPointer);
    //p->NextPointer = VarElem;
    
    L->ElemArrayLen++;
    //printf("Insert Data Success\n");
    //PrintPretty();
    return SuccessFlag;
}

Status DeleteLinkListElem(LinkList *L, int ElemPosition, ElemType *DelVarElem)
{
    JudgePointerNull(L);
    printf("ElemPosition          : %d\n",ElemPosition);
    if(ElemPosition < 1 || ElemPosition > L->ElemArrayLen)
    {
        printf("Error ,Need 1 <= ElemPosition <= %d\n",L->ElemArrayLen);
        PrintPretty();
        return FailFlag;
    }

    int i = 0;
    ElemType *p = L->ElemArray;
    while(p)
    {
        if(i == ElemPosition - 1)
        {
            break;
        }
        p = p->NextPointer;
        i++;
    }

    ElemType *TmpDelElem = p->NextPointer;
    CopyElemTypeData(DelVarElem,TmpDelElem);
    //DelVarElem = TmpDelElem; //虽然这样方便,但怕出现问题,就用上面的方法把。
    //PrintElemType(DelVarElem);
    p->NextPointer = TmpDelElem->NextPointer;
    free(TmpDelElem);
    TmpDelElem = NULL;

    L->ElemArrayLen--;
    printf("Delete Data Success\n");
    PrintPretty();
    return SuccessFlag;
}

Status CreateHeadLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("LinkListLen Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Head Insert Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
    InitElemType(InsertElem);
    for(i=1; i<=LinkListLen; i++)
    {
        //ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InsertLinkListElem(L, 1, *InsertElem);
        //free(InsertElem);
        //InsertElem = NULL;
    }
    free(InsertElem);
    InsertElem = NULL;
    printf("Create Empty Head Insert Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

Status CreateHeadLinkList_V1(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("LinkListLen Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Head Insert Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        InsertElem->NextPointer   = L->ElemArray->NextPointer;
        L->ElemArray->NextPointer = InsertElem;
        (L->ElemArrayLen)++;
    }
    printf("Create Empty Head Insert Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

void ComputeProcedureTime(Status Func(LinkList *, int), LinkList *L, int LinkListLen)
{
    printf("========================================\n");
    struct timeval start,end;
    unsigned long TotalTime;
    gettimeofday(&start, NULL);
    Func(L, LinkListLen);
    gettimeofday(&end, NULL);
    TotalTime = end.tv_sec - start.tv_sec;
    printf("Elapsed Time : %ld s\n",TotalTime);
}

Status CreateTailLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("LinkListLen Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Tail Insert Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *CurNode = L->ElemArray;
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        CurNode->NextPointer = InsertElem;
        CurNode              = InsertElem;
        (L->ElemArrayLen)++;
    }
    printf("Create Empty Tail Insert Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

Status CreateCycleLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("Cycle Link List Len Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Cycle Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *CurNode = L->ElemArray;
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        CurNode->NextPointer = InsertElem;
        CurNode              = InsertElem;
        (L->ElemArrayLen)++;
    }
    CurNode->NextPointer = L->ElemArray;
    printf("Create Empty Cycle Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}


Status CreateCycleTailLinkList(LinkList *L, int LinkListLen)
{
    JudgePointerNull(L);
    if(LinkListLen < 1)
    {
        printf("Cycle Tail Link List Len Need >= 1\n");
        return FailFlag;
    }
    printf("Create Empty Cycle Tail Link List Len : %d\n",LinkListLen);
    int i;
    InitLinkList(L);
    ElemType *CurNode = L->ElemArray;
    for(i=1; i<=LinkListLen; i++)
    {
        ElemType *InsertElem = (ElemType *)MyMalloc(sizeof(ElemType));
        InitElemType(InsertElem);
        CurNode->NextPointer = InsertElem;
        CurNode              = InsertElem;
        (L->ElemArrayLen)++; 
    }
    CurNode->NextPointer = L->ElemArray;
    L->ElemArray         = CurNode;
    L->ElemArrayLen      = LinkListLen;
    printf("Create Empty Cycle Tail Link List Success\n");
    PrintPretty();
    return SuccessFlag;
}

Status UpdateCycleTailLinkListElem(LinkList *L, int Position, ElemType UpdateElem)
{
    JudgePointerNull(L);
    if(Position < 1 || Position > L->ElemArrayLen)
    {
        printf("Position Need >= 1 and <= %d\n",L->ElemArrayLen);
        return FailFlag;
    }
    if(Position == L->ElemArrayLen)
    {
        CopyElemTypeDataNoNextP(L->ElemArray, &UpdateElem);
        printf("Update Cycle Tail Link List Elem Success\n");
        return SuccessFlag;
    }
    int i;
    ElemType *TmpNode = L->ElemArray->NextPointer;
    for(i=1; i<= Position; i++)
    {
        TmpNode = TmpNode->NextPointer;
    }
    CopyElemTypeDataNoNextP(TmpNode, &UpdateElem);
    printf("Update Cycle Tail Link List Elem Success\n");
    PrintPretty();
    return SuccessFlag;
}

LinkList *Connect2CycleTailLinkList(LinkList *L1, LinkList *L2)
{
    JudgePointerNull(L1);
    JudgePointerNull(L2);
    printf("Connect 2 Cycle Tail Link List ");
    LinkList *NewCTLinkList     = (LinkList *)MyMalloc(sizeof(LinkList));
    //NewCTLinkList->ElemArray    = (ElemType *)MyMalloc(sizeof(ElemType));
    NewCTLinkList->ElemArrayLen = (L1->ElemArrayLen) + (L2->ElemArrayLen);
    NewCTLinkList->ElemArray    = L2->ElemArray;
    ElemType *L1Head            = L1->ElemArray->NextPointer;
    ElemType *L2Head            = L2->ElemArray->NextPointer;
    L2->ElemArray->NextPointer  = L1Head;
    L1->ElemArray->NextPointer  = L2Head->NextPointer;

    free(L2Head);
    L1->ElemArray = NULL;
    L2->ElemArray = NULL;
    L1->ElemArrayLen = 0;
    L2->ElemArrayLen = 0;
    printf("Success \n");
    PrintPretty();    
    return NewCTLinkList;
}

2、LinearTable_LinkList.h

#ifndef LinearTable_LinkList_H
#define LinearTable_LinkList_H

#define InsertDataArrayLen 6

#define ExceptionExitFlag -1
#define SuccessFlag        1
#define FailFlag           0
#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 JudgeElemTypePointerIsNull(ElemType *E);
void PrintLinkList(LinkList *L);
int JudgeLinkListIsEmpty(LinkList *L);
void DestroyLinkList(LinkList *L);
Status ClearLinkListElem(LinkList *L);
int GetLinkListLen(LinkList *L);
Status CopyElemTypeData(ElemType *Dest, ElemType *Src);
Status CopyElemTypeDataNoNextP(ElemType *Dest, ElemType *Src);
int GetLinkListElem(LinkList *L, int ElemPosition, ElemType *VarElem);
void PrintElemType(ElemType *E);
Status CmpElemType(ElemType *E1, ElemType *E2);
ElemType * LocateElemPointer(LinkList *L, ElemType E);
int LocateElemPosition(LinkList *L, ElemType E);
Status InsertLinkListElem(LinkList *L, int ElemPosition, ElemType VarElem);
Status DeleteLinkListElem(LinkList *L, int ElemPosition, ElemType *DelVarElem);
Status CreateHeadLinkList(LinkList *L, int LinkListLen);
Status CreateHeadLinkList_V1(LinkList *L, int LinkListLen);
Status CreateTailLinkList(LinkList *L, int LinkListLen);
Status CreateCycleLinkList(LinkList *L, int LinkListLen);
Status CreateCycleTailLinkList(LinkList *L, int LinkListLen);
Status UpdateCycleTailLinkListElem(LinkList *L, int Position, ElemType UpdateElem);
LinkList *Connect2CycleTailLinkList(LinkList *L1, LinkList *L2);

void ComputeProcedureTime(Status Func(LinkList *, int), LinkList *L, int LinkListLen);
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));
    ElemType *InsertElemArray = (ElemType *)MyMalloc(sizeof(ElemType) * InsertDataArrayLen);
    ElemType *DelVarElem      = (ElemType *)MyMalloc(sizeof(ElemType));
    int i;

    for(i=0; i<InsertDataArrayLen; i++)
    {
        InitElemType(&(InsertElemArray[i]));
        strcpy(InsertElemArray[i].StudentNum ,"X666");
        strcpy(InsertElemArray[i].StudentName,"Sun");
        InsertElemArray[i].StudentScore = i + 100;
    }

    InitLinkList(L);
    //PrintLinkList(L);
    for(i=0; i<InsertDataArrayLen; i++)
    {
        InsertLinkListElem(L, 1, InsertElemArray[i]);
    }
    PrintLinkList(L);
    GetLinkListElem(L, InsertDataArrayLen - 1, VarElem);
    //PrintElemType(VarElem);
    LocateElemPointer(L,*VarElem);
    LocateElemPosition(L,*VarElem);
    //PrintElemType(VarElem);
    JudgeLinkListIsEmpty(L);
    DeleteLinkListElem(L, InsertDataArrayLen, DelVarElem);
    DeleteLinkListElem(L, InsertDataArrayLen / 2, DelVarElem);
    DeleteLinkListElem(L, 1, DelVarElem);
    PrintLinkList(L);
    GetLinkListLen(L);
    ClearLinkListElem(L);
    //PrintLinkList(L);
    DestroyLinkList(L);

    free(VarElem);
    //free(InsertElemArray);
    free(DelVarElem);
    L               = NULL;
    VarElem         = NULL;
    //InsertElemArray = NULL;
    DelVarElem      = NULL;

    //测试单链表建立-头插法,尾插法
    int LinkListLen = InsertDataArrayLen;
    
    LinkList *H = (LinkList *)MyMalloc(sizeof(LinkList));
    ComputeProcedureTime(CreateHeadLinkList,H, LinkListLen);
    //PrintLinkList(H);
    DestroyLinkList(H);
    H = NULL;

    LinkList *H1 = (LinkList *)MyMalloc(sizeof(LinkList));
    ComputeProcedureTime(CreateHeadLinkList_V1,H1, LinkListLen);
    //PrintLinkList(H1);
    DestroyLinkList(H1);
    H1 = NULL;
    
    LinkList *H2 = (LinkList *)MyMalloc(sizeof(LinkList));
    ComputeProcedureTime(CreateTailLinkList,H2, LinkListLen);
    //PrintLinkList(H2);
    DestroyLinkList(H2);
    H2 = NULL;

    //测试单链表建立-循环链表返回头指针
    //循环链表只改造了PrintLinkList和DestroyLinkList,其他方法不一定适用。
    LinkList *C = (LinkList *)MyMalloc(sizeof(LinkList));
    CreateCycleLinkList(C, LinkListLen);
    PrintLinkList(C);
    DestroyLinkList(C);
    C = NULL;

    //测试单链表建立-尾指针循环链表
    //循环链表只改造了PrintLinkList和DestroyLinkList,其他方法不一定适用。
    LinkList *CT = (LinkList *)MyMalloc(sizeof(LinkList));
    CreateCycleTailLinkList(CT, LinkListLen);
    for(i=0; i<LinkListLen; i++)
    {
        UpdateCycleTailLinkListElem(CT, i+1, InsertElemArray[i]);
    }
    PrintLinkList(CT);

    LinkList *CT1 = (LinkList *)MyMalloc(sizeof(LinkList));
    CreateCycleTailLinkList(CT1, LinkListLen);
    for(i=LinkListLen-1; i>=0; i--)
    {
        UpdateCycleTailLinkListElem(CT1, i+1, InsertElemArray[i]);
    }
    PrintLinkList(CT1);
    
    //尾指针循环链表-两表链接
    LinkList *CT2 = Connect2CycleTailLinkList(CT,CT1);
    PrintLinkList(CT2);

    DestroyLinkList(CT1);
    CT1 = NULL;
    DestroyLinkList(CT);
    CT = NULL;
    DestroyLinkList(CT2);
    CT2 = NULL;

    free(InsertElemArray);
    InsertElemArray = NULL;
    return SuccessFlag;
}

4、makefile

CC = gcc
CFLAG_EXEC = -Wall -O3
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 -O3 LinearTable_LinkList.c main.c -o Test_LinearTable_LinkList

[gbase@czg2 LinearTable_LinkList]$ ./Test_LinearTable_LinkList 
Init LinkList Success
*********************************
Print Link List
Link List Pointer     : 0xf8b010
################
CurrentPointer        : 0xf8b160
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b280
################
CurrentPointer        : 0xf8b280
StudentNum            : X666
StudentName           : Sun
StudentScore          : 105
NextPointer           : 0xf8b250
################
CurrentPointer        : 0xf8b250
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b220
################
CurrentPointer        : 0xf8b220
StudentNum            : X666
StudentName           : Sun
StudentScore          : 103
NextPointer           : 0xf8b1f0
################
CurrentPointer        : 0xf8b1f0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b1c0
################
CurrentPointer        : 0xf8b1c0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : 0xf8b190
################
CurrentPointer        : 0xf8b190
StudentNum            : X666
StudentName           : Sun
StudentScore          : 100
NextPointer           : (nil)
################
ElemArrayLen          : 6
*********************************
ElemPosition          : 5 ,Get Data Success
*********************************
Locate Element Pointer
Pointer               : 0xf8b1c0
Locate Link List Elem Success
*********************************
Locate Element Position
Position              : 5
Locate Link List Elem Success
*********************************
Link List Is Not Empty
*********************************
ElemPosition          : 6
Delete Data Success
*********************************
ElemPosition          : 3
Delete Data Success
*********************************
ElemPosition          : 1
Delete Data Success
*********************************
Print Link List
Link List Pointer     : 0xf8b010
################
CurrentPointer        : 0xf8b160
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b250
################
CurrentPointer        : 0xf8b250
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b1f0
################
CurrentPointer        : 0xf8b1f0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b1c0
################
CurrentPointer        : 0xf8b1c0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : (nil)
################
ElemArrayLen          : 3
*********************************
Get Link List Len     : 3
*********************************
Start Clear Link List Elem
Clear Link List Elem Success !!!
*********************************
Start Destroy Link List
Destroy Success !!!
*********************************
========================================
Create Empty Head Insert Link List Len : 6
Init LinkList Success
*********************************
Create Empty Head Insert Link List Success
*********************************
Elapsed Time : 0 s
Start Destroy Link List
Destroy Success !!!
*********************************
========================================
Create Empty Head Insert Link List Len : 6
Init LinkList Success
*********************************
Create Empty Head Insert Link List Success
*********************************
Elapsed Time : 0 s
Start Destroy Link List
Destroy Success !!!
*********************************
========================================
Create Empty Tail Insert Link List Len : 6
Init LinkList Success
*********************************
Create Empty Tail Insert Link List Success
*********************************
Elapsed Time : 0 s
Start Destroy Link List
Destroy Success !!!
*********************************
Create Empty Cycle Link List Len : 6
Init LinkList Success
*********************************
Create Empty Cycle Link List Success
*********************************
Print Link List
Link List Pointer     : 0xf8b010
################
CurrentPointer        : 0xf8b160
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b130
################
CurrentPointer        : 0xf8b130
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b220
################
CurrentPointer        : 0xf8b220
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b280
################
CurrentPointer        : 0xf8b280
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b250
################
CurrentPointer        : 0xf8b250
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b1f0
################
CurrentPointer        : 0xf8b1f0
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b1c0
################
CurrentPointer        : 0xf8b1c0
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b160
################
Cycle Link List Printf End
ElemArrayLen          : 6
*********************************
Start Destroy Link List
Cycle Link List Destroy Success !!!
*********************************
Create Empty Cycle Tail Link List Len : 6
Init LinkList Success
*********************************
Create Empty Cycle Tail Link List Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
Print Link List
Link List Pointer     : 0xf8b010
################
CurrentPointer        : 0xf8b160
StudentNum            : X666
StudentName           : Sun
StudentScore          : 105
NextPointer           : 0xf8b1c0
################
CurrentPointer        : 0xf8b1c0
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b1f0
################
CurrentPointer        : 0xf8b1f0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 100
NextPointer           : 0xf8b250
################
CurrentPointer        : 0xf8b250
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : 0xf8b280
################
CurrentPointer        : 0xf8b280
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b220
################
CurrentPointer        : 0xf8b220
StudentNum            : X666
StudentName           : Sun
StudentScore          : 103
NextPointer           : 0xf8b130
################
CurrentPointer        : 0xf8b130
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b160
################
Cycle Link List Printf End
ElemArrayLen          : 6
*********************************
Create Empty Cycle Tail Link List Len : 6
Init LinkList Success
*********************************
Create Empty Cycle Tail Link List Success
*********************************
Update Cycle Tail Link List Elem Success
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Update Cycle Tail Link List Elem Success
*********************************
Print Link List
Link List Pointer     : 0xf8b2b0
################
CurrentPointer        : 0xf8b390
StudentNum            : X666
StudentName           : Sun
StudentScore          : 105
NextPointer           : 0xf8b030
################
CurrentPointer        : 0xf8b030
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b190
################
CurrentPointer        : 0xf8b190
StudentNum            : X666
StudentName           : Sun
StudentScore          : 100
NextPointer           : 0xf8b2d0
################
CurrentPointer        : 0xf8b2d0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : 0xf8b300
################
CurrentPointer        : 0xf8b300
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b330
################
CurrentPointer        : 0xf8b330
StudentNum            : X666
StudentName           : Sun
StudentScore          : 103
NextPointer           : 0xf8b360
################
CurrentPointer        : 0xf8b360
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b390
################
Cycle Link List Printf End
ElemArrayLen          : 6
*********************************
Connect 2 Cycle Tail Link List Success 
*********************************
Print Link List
Link List Pointer     : 0xf8b3c0
################
CurrentPointer        : 0xf8b390
StudentNum            : X666
StudentName           : Sun
StudentScore          : 105
NextPointer           : 0xf8b1c0
################
CurrentPointer        : 0xf8b1c0
StudentNum            : 
StudentName           : 
StudentScore          : 0
NextPointer           : 0xf8b1f0
################
CurrentPointer        : 0xf8b1f0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 100
NextPointer           : 0xf8b250
################
CurrentPointer        : 0xf8b250
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : 0xf8b280
################
CurrentPointer        : 0xf8b280
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b220
################
CurrentPointer        : 0xf8b220
StudentNum            : X666
StudentName           : Sun
StudentScore          : 103
NextPointer           : 0xf8b130
################
CurrentPointer        : 0xf8b130
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b160
################
CurrentPointer        : 0xf8b160
StudentNum            : X666
StudentName           : Sun
StudentScore          : 105
NextPointer           : 0xf8b190
################
CurrentPointer        : 0xf8b190
StudentNum            : X666
StudentName           : Sun
StudentScore          : 100
NextPointer           : 0xf8b2d0
################
CurrentPointer        : 0xf8b2d0
StudentNum            : X666
StudentName           : Sun
StudentScore          : 101
NextPointer           : 0xf8b300
################
CurrentPointer        : 0xf8b300
StudentNum            : X666
StudentName           : Sun
StudentScore          : 102
NextPointer           : 0xf8b330
################
CurrentPointer        : 0xf8b330
StudentNum            : X666
StudentName           : Sun
StudentScore          : 103
NextPointer           : 0xf8b360
################
CurrentPointer        : 0xf8b360
StudentNum            : X666
StudentName           : Sun
StudentScore          : 104
NextPointer           : 0xf8b390
################
Cycle Link List Printf End
ElemArrayLen          : 12
*********************************
Start Destroy Link List
Destroy Success !!!
*********************************
Start Destroy Link List
Destroy Success !!!
*********************************
Start Destroy Link List
Cycle Link List Destroy Success !!!
*********************************

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

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

相关文章

实现端口扫描

实现原理 tcp扫描 创建tcp客户端然后与目标地址的每个端口建立连接&#xff0c;如果能连接成功说明目标地址此端口已经被打开。 判断是什么协议 连接成功后读取字节&#xff0c;如ssh协议的端口会读取到如这种的数据SSH-2.0-OpenSSH_7.4;创建http/s客户端与已经扫描出来的端…

LINUX漏洞复现篇之ShellShock漏洞

简介 ShellShock漏洞, 中文称为"破壳漏洞", 是Unix Shell中的安全漏洞 在一些网络服务器的部署中, 使用bash来处理某些请求, 允许攻击者通过低版本的bash执行任意Shell命令 此漏洞在调用BashShell之前使用payload创建环境变量, 这些环境变量包含Shell代码, 在Shel…

家庭生活开支如何记录,怎么记账一目了然

家庭日常开支明细怎么记账一目了然呢&#xff1f;很多上了年龄的人比较擅长使用传统的方法纸笔记录家庭账目&#xff0c;可是统计起来就比较麻烦&#xff1b;而年轻人则比较跟随时代潮流&#xff0c;喜欢使用一些电子记账工具&#xff0c;比如借助电脑手机上的记账类软件来记录…

5个实用的性能测试工具(软件测试工程师必备)

在日常的软件测试工作中&#xff0c;最常用的性能测试工具是LoadRunner和Jmeter。今天给大家整理了5个针对web应用程序性能和负载压力能力的最广泛使用的性能测试工具。 这几个负载测试工具将确保应用程序在高峰流量和极端压力条件下的性能。 包括开源和授权的性能测试工具。…

国内食用油行业数据浅析

大家好&#xff0c;这里是小安说网控。 食用油是生活必备品之一&#xff0c;其中植物油占消费主导地位。 据国家统计局数据&#xff0c;2022年10月份国内精制食用植物油产量当期值为428.6万吨&#xff0c;同比下降0.8%&#xff1b;1-10月份精制食用植物油累计产量3925.2万吨&am…

Whitelabel Error Page

直接上图&#xff0c;就这个该死的错误&#xff01;&#xff01; 控制台报错&#xff1a;No mapping for GET /front/page/login.html 首先这个错误就是请求路径问题&#xff0c;或者根本没加载上html。 原因&#xff1a;springboot中&#xff0c;静态资源默认访问static和te…

现在的程序员真是越来越懒了,api 文档都懒得写!程序员:“api工具惯的”

为了让大家更能清楚了解 Api 相关往期内容&#xff0c;我写了一个阅读指引&#xff1a; 序号学习路径指引链接1Api -- 连接世界的 Super StarApi -- 连接世界的Super Star_不吃西红柿丶的博客-CSDN博客2软件吞噬世界&#xff0c;Api 快速入门到放弃软件吞噬世界&#xff0c;Ap…

为什么在vue2中改变数据视图不会更新,带你阅读源码

1. 监听数组变化 其实 Vue 监听数组变化的原理非常简单, 就是将数组的主要方法包裹了一遍只要用户调用以下方法, 就会通知 Watcher 自动更新视图: push()pop()shift()unshift()splice()sort()reverse() 演示 工程源码: src/core/observer/array.js // 获取数组的原型 Array.…

jsp servlet mysql实现的二手车汽车管理系统项目源码附带视频指导运行教程

今天给大家演示一下由jsp servlet mysql实现的一款简单的二手车汽车管理系统&#xff0c;系统设计采用了mvc分层的模式&#xff0c;结构非常清晰&#xff0c;功能虽简单&#xff0c;但是把所有可能用到的功能都实现了&#xff0c;往上面添加功能很简单&#xff0c;直接复制代码…

木聚糖-聚乙二醇-苯硼酸,PBA-PEG-Xylan,苯硼酸-PEG-木聚糖

木聚糖-聚乙二醇-苯硼酸&#xff0c;PBA-PEG-Xylan&#xff0c;苯硼酸-PEG-木聚糖 中文名称&#xff1a;木聚糖-苯硼酸 英文名称&#xff1a;Xylan-PBA 别称&#xff1a;苯硼酸修饰木聚糖&#xff0c;PBA-木聚糖 PEG接枝修饰木聚糖 木聚糖-聚乙二醇-苯硼酸 PBA-PEG-Xylan…

这样设置你的头像更容易火,自媒体7类头像优劣分析,变现路更轻松

你必须知道的知识&#xff1a;个人IP自媒体短视频头像设置的7种选择。 首先头像无非就是露脸的或者不露脸的两种。 其实大家做IP的话&#xff0c;建议大家露脸。这是在我赢助手小禾呈序个人IP培养里特别强调的&#xff0c;这个说的不光是你的头像&#xff0c;还有你的视频&…

私有化部署,加强文档管理系统稳定性

编者按&#xff1a;本文介绍了天翎知识文档管理系统结合群晖NAS解决方案是如何在企业系统的稳定性和安全星这块实践的。 关键词&#xff1a;私有化部署&#xff0c;外网访问&#xff0c;数据备份&#xff0c;安全技术&#xff0c;病毒防护 用于管理企业大量文档资料的系统&am…

A-level商务例题解析及练习market segmentatio

今日知识点&#xff1a;market segmentatio 例题 Q: Discuss how market segmentation could be used to improve the profitability of a hotel.解析 Answers may include: market segmentation – identify different segments within a market and target different produc…

Python for循环

Python的for循环 一、for循环 for循环&#xff1a;循环就是重复做某件事&#xff0c;for循环是python提供第二种循环机制&#xff08;第一种是while循环&#xff09;&#xff0c;理论上for循环能做的事情&#xff0c;while循环都可以做。 目的&#xff1a;之所以要有for循环…

自定义HandlerMethodArgumentResolver如何注册到springmvc框架里的

目录 1.DEBUG 注册代码 1.1 WebMvcConfigurerComposite 1.2 DelegatingWebMvcConfiguration 1.3 AutowiredAnnotationBeanPostProcessor 2.DEBUG调用代码 2.1 this.argumentResolvers 日常工作开发中&#xff0c;总有一些参数&#xff0c;在未传参数时&#xff0c;需要自定…

零编程制作疫情全国行政区地图,理性看待各地疫情防控减码

1 前言 北京宣布&#xff0c;12月5日首班车起&#xff0c;公交、地铁不得拒绝无48小时核酸阴性证明的乘客乘车。 上海宣布&#xff0c;12月5日零时起&#xff0c;乘坐地铁、公交、轮渡&#xff0c;不再查验核酸检测阴性证明。 杭州和宁波深夜发布&#xff0c;12月5日起&…

Stable Diffusion8

也写到第八了 ~~ 这次还是和mac相关哦~~ 先吹吹,苹果亲自下场优化&#xff0c;在iPhone、iPad、Mac等设备上以惊人的速度运行Stable Diffusion就是这么简单。 输入一句话就能生成图像的 Stable Diffusion 已经火爆数月。它是一个开源模型&#xff0c;而且在消费级 GPU 上就能…

如何配置settings.py文件

文章目录配置settings.py文件1) 修改语言与时区配置2) 设置时区不敏感3) 配置项目所需数据库4&#xff09;学会阅读报错信息配置settings.py文件 《settings.py配置文件&#xff08;详解&#xff09;》一文中&#xff0c;将 settings.py 配置文件的每一项给大家做了介绍。在开…

Matplotlib入门[03]——处理文本

Matplotlib入门[03]——处理文本 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网Python 字符串前缀r、u、b、f含义 使用Jupyter进行练习 import matplotlib.pyplot as plt import numpy as np处理文本-基础 基础文本函数 在 matplotlib.pyplot 中&#xf…

服务访问质量(QoS)介绍与技术 二

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…