链表基础知识梳理

链表是乱序的多组数据相互联系构成的

链表操作分为:初始化,创建,插入,删除,遍历,查询,逆序,是否有环

链表定义
typedef struct LinkList

{

     int Element;
     
     LinkList * next;

}LinkList;

初始化

linklist * List_init()

{

linklist *HeadNode= (linklist*)malloc(sizeof(linklist));

if(HeadNode == NULL)

{

    printf("空间缓存不足");

    return HeadNode;

}

HeadNode->Element= 0;

HeadNode->next= NULL;



returnHeadNode;

}
链表创建
void CreatList(linklist *HeadNode,int *InData,int DataNum)

{

int i = 0;

linklist *CurrentNode = (linklist*) HeadNode;

for(i = 0;i<DataNum;i++)

{

    CurrentNode->Element = InData[i];

    if(i< DataNum-1)// 由于每次赋值后需要新建结点,为了保证没有多余的废结点

    {

        CurrentNode->next =(linklist *)malloc(sizeof(linklist));

        CurrentNode= CurrentNode->next;

    }

}

CurrentNode->next= NULL;

}
插入节点
bool InsertList(linklist *HeadNode,int LocateIndex,int InData)

{

int i=1;// 由于起始结点HeadNode是头结点,所以计数从1开始

linklist *CurrentNode= (linklist *) HeadNode;

//将CurrentNode指向待插入位置的前一个结点(index -1)

while(CurrentNode&& i<LocateIndex-1)

{

    CurrentNode= CurrentNode->next;

    i++;

}

linklist *NodeToInsert=(linklist*)malloc(sizeof(linklist));

if(NodeToInsert == NULL)

{

    printf("空间缓存不足");

    return ERROR;

}

NodeToInsert->Element= InData;

NodeToInsert->next = CurrentNode->next;

CurrentNode->next = NodeToInsert;

return OK;

}
删除节点
bool DeleteList(linklist * HeadNode,int index, int * DataToDel)

{

int i = 1;

linklist *CurrentNode  = HeadNode; 

linklist *NodeToDelete;

//将CurrentNode指向待删除位置的前一个结点(index -1)

while(CurrentNode&& i<index-1)

{

    CurrentNode= CurrentNode->next;

    i++;

}

NodeToDelete = CurrentNode->next;

*DataToDel =NodeToDelete->Element;

CurrentNode->next= NodeToDelete->next;

free(NodeToDelete);

return OK;

}
获取链表长度
int GetListLength(linklist *HeadNode)

{

int ListLength = 0;

linklist *CurrentNode= (linklist*) HeadNode;

while(CurrentNode)// 当前指针不为空时可以计数累加

{

    ListLength++;

    CurrentNode= CurrentNode->next;    //指针移到下一结点

}

returnListLength;

}
获取链表元素
int LocateElement(linklist * HeadNode,int DataToLocate)

{

int LocateIndex = 1;

linklist *CurrentNode= (linklist*) HeadNode;

while(CurrentNode)

{

    if(CurrentNode->Element== DataToLocate)

    {

        returnLocateIndex; //找到位置返回

    }

    CurrentNode= CurrentNode->next;

    LocateIndex++;

}

return -1; //如果没有这个值,返回-1

}
链表置空
bool DestroyList(linklist * HeadNode)

{

linklist *pNext;

linklist *CurrentNode= (linklist*) HeadNode;

while(CurrentNode)

{

    pNext = CurrentNode->next;

    free(CurrentNode);

    CurrentNode= pNext;

}

HeadNode->next = NULL;

return OK;

}
链表逆序
linklist * ListRotate(linklist * HeadNode)

{

linklist* current,*pNext,*pPrev;

pPrev = (linklist*)malloc(sizeof(linklist));

if(pPrev == NULL)

{

    printf("空间缓存不足");

    return ERROR;

}

pPrev->next = HeadNode;

current = HeadNode;

while(current->next)

{

    pNext = current->next;

    current->next = pNext->next;

    pNext->next = pPrev->next;

    pPrev->next = pNext;

}

return pPrev->next;

}
链表是否有环
bool IsListLoop(linklist *HeadNode)

{

linklist *pFast,*pSlow;

pFast = pSlow = HeadNode;

while(pFast && pSlow)

{

    pSlow = pSlow->next;

    if(pFast->next)

    {

        pFast= pFast->next->next;

    }

    else

    {

        pFast= pFast->next;

    }

    if(pFast == pSlow)

    {

        returnTRUE;

    }

}

return FALSE;

}

仔细看了某位大神的代码,又梳理了一遍链表的基础知识,写的还是比较有逻辑的,只有一个逆序的操作,觉得有点冗余,下次用更其他好理解的方式自己再试一遍,代码没有自己敲,后面用到的时候再仔细斟酌下。

引用:https://blog.csdn.net/u012531536/article/details/80170893

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值