链表是乱序的多组数据相互联系构成的
链表操作分为:初始化,创建,插入,删除,遍历,查询,逆序,是否有环
链表定义
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.youkuaiyun.com/u012531536/article/details/80170893