//頭文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef int DataType;
typedef struct LinkList
{
DataType _data;
struct LinkList* _next;
}LinkList,*pLinkList;
void InitLinkList(pLinkList& pHead);
void PrintLinkList(pLinkList pHead);
int GetListLength(pLinkList pHead);
void DestroyList(pLinkList& pHead);
void PushBack(pLinkList& pHead,DataType Data);
void PopBack(pLinkList& pHead);
void PushFront(pLinkList& pHead, DataType Data);
void BuyNode(pLinkList& pHead,DataType Data);
pLinkList Find(pLinkList pHead,DataType Data);
void Insert(pLinkList pos, DataType Data);
void Remove(pLinkList& pHead, DataType Data);
void RemoveAll(pLinkList& pHead, DataType Data);
void Erase(pLinkList& pHead, pLinkList pos);
void BubbleSort( pLinkList pHead);
int JosephusCircle(pLinkList pHead, int num);
void QuickSort(pLinkList pHead,pLinkList pEnd);
void ReverseList(pLinkList& pHead);
pLinkList IfCircleList(pLinkList pHead);
pLinkList CircleListEntrance(pLinkList pHead);
#endif
//函數文件
#include<stdio.h>
#include"linklist.h"
#include<malloc.h>
#include<assert.h>
//初始化節點
void InitLinkList(pLinkList& pNode)
{
assert(pNode);
pNode->_next = NULL;
pNode->_data = 0;
}
//遍歷輸出鏈表數據域
void PrintLinkList(pLinkList pHead)
{
pLinkList tmp = pHead;
if (pHead == NULL)
{
printf("鏈表為空!\n");
}
while (tmp)
{
printf("%d ", tmp->_data);
tmp = tmp->_next;
}
printf("\n");
}
//求長度
int GetListLength(pLinkList pHead)
{
int length = 0;
while (pHead)
{
pHead = pHead->_next;
++length;
}
return length;
}
//銷毀鏈表
void DestroyList(pLinkList& pHead)
{
pLinkList del = pHead;
if (pHead == NULL)
{
printf("鏈表為空!\n");
}
while (pHead)
{
del = pHead->_next;
if (pHead->_next==NULL)
{
free(pHead);
pHead =NULL;
return;
}
pHead->_next = pHead->_next->_next;
free(del);
}
}
//尾插
void PushBack(pLinkList& pHead,DataType Data)
{
pLinkList tmp = pHead;
if (pHead == NULL)
{
BuyNode(pHead, Data);
}
else
{
while (tmp->_next)
{
tmp = tmp->_next;
}
BuyNode(tmp->_next, Data);
}
}
//尾刪
void PopBack(pLinkList& pHead)
{
pLinkList tmp = pHead;
if (tmp == NULL)
{
printf("鏈表已空!\n");
return;
}
if (pHead->_next == NULL)
{
free(pHead);
pHead = NULL;
return;
}
while (tmp->_next->_next!=NULL)
{
tmp = tmp->_next;
}
free(tmp->_next);
tmp->_next = NULL;
}
//頭插
void PushFront(pLinkList& pHead, DataType Data)
{
pLinkList tmp;
BuyNode(tmp,Data);
tmp->_next = pHead;
pHead = tmp;
}
//創建節點
void BuyNode(pLinkList& pNode, DataType Data)
{
pNode = (pLinkList)malloc(sizeof(LinkList));
pNode->_data = Data;
pNode->_next = NULL;
}
//查找
pLinkList Find(pLinkList pHead,DataType Data)
{
pLinkList tmp = pHead;
assert(pHead);
while (tmp)
{
if (tmp->_data == Data)
return tmp;
tmp = tmp->_next;
}
return NULL;
}
//中 後插
void Insert(pLinkList pos, DataType Data)
{
assert(pos);
pLinkList tmp = pos->_next;
BuyNode(pos->_next, Data);
pos->_next->_next = tmp;
}
//刪除給定數據節點
void Remove(pLinkList& pHead, DataType Data)
{
pLinkList del = Find(pHead, Data);
pLinkList tmp = pHead;
if (pHead == NULL)
{
printf("鏈表為空!\n");
return;
}
if (pHead == del)
{
pHead = pHead->_next;
free(tmp);
return;
}
while (tmp->_next )
{
if (tmp->_next == del)
{
tmp->_next = tmp->_next->_next;
free(del);
return;
}
tmp = tmp->_next;
}
}
//刪除所有給定數據節點
void RemoveAll(pLinkList &pHead, DataType Data)
{
pLinkList del = Find(pHead, Data);
pLinkList tmp = pHead;
if (pHead == NULL)
{
printf("鏈表為空!\n");
return;
}
while (tmp->_next&&del!=NULL)
{
del = Find(pHead, Data);
if (pHead == del)
{
pHead = pHead->_next;
free(tmp);
tmp = pHead;
}
else if (tmp->_next== del)
{
tmp->_next = tmp->_next->_next;
free(del);
}
else
tmp = tmp->_next;
}
}
//刪除位置節點
void Erase(pLinkList& pHead, pLinkList pos)
{
pLinkList tmp = pHead;
assert(pHead);
assert(pos);
if (pHead == pos)
{
pHead = pHead->_next;
return;
}
while (tmp)
{
if (tmp->_next == pos)
{
tmp->_next = tmp->_next->_next;
free(pos);
break;
}
tmp = tmp->_next;
}
}
//冒泡排序 升序
void BubbleSort(pLinkList pHead)
{
pLinkList tmp = pHead,index=pHead;
int count = 0;
assert(pHead);
while (index)
{
tmp = pHead;
while (tmp->_next)
{
if ((tmp->_data) > (tmp->_next->_data))
{
DataType change = tmp->_data;
tmp->_data = tmp->_next->_data;
tmp->_next->_data = change;
++count;
}
tmp = tmp->_next;
}
if (count <= 1)
return;
else
{
tmp = pHead;
index = index->_next;
}
}
}
//約瑟夫環 假設鏈表為環 num=3
int JosephusCircle(pLinkList pHead, int num)
{
pLinkList tmp = pHead;
assert(pHead);
while (tmp->_next!=tmp)
{
pLinkList del = NULL;
tmp = tmp->_next->_next;
tmp->_data = tmp->_next->_data;
del = tmp->_next;
tmp->_next = tmp->_next->_next;
free(del);
}
return tmp->_data;
}
//快排
void QuickSort(pLinkList pHead, pLinkList pEnd)
{
pLinkList cur ;
pLinkList prev = pHead;
pLinkList key = pHead;
DataType tmp = 0;
if (pHead==NULL||pHead->_next==NULL)
{
return;
}
cur = pHead->_next;
if (pEnd == pHead->_next||pEnd==pHead)
{
return;
}
while (cur!=pEnd)
{
if (cur->_data < key->_data)
{
prev = prev->_next;
if (cur != prev)
{
DataType tmp = cur->_data;
cur->_data = prev->_data;
prev->_data = tmp;
}
}
cur = cur->_next;
}
tmp = prev->_data;
prev->_data = key->_data;
key->_data = tmp;
QuickSort(pHead, prev);
QuickSort(prev->_next, pEnd);
}
//逆置
void ReverseList(pLinkList& pHead)
{
pLinkList NewHead = NULL;
pLinkList tmp =NULL;
if (!pHead || !pHead->_next)
return;
while (pHead)
{
NewHead = pHead->_next;
pHead->_next =tmp;
tmp = pHead;
pHead = NewHead;
}
pHead = tmp;
}
//判斷單鏈表是否帶環
pLinkList IfCircleList(pLinkList pHead)
{
pLinkList fast = pHead;
pLinkList slow = pHead;
assert(pHead);
while (fast&&fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
if (fast == slow)
{
return fast;
}
}
return NULL;
}
//判斷環的入口點
pLinkList CircleListEntrance(pLinkList pHead)
{
pLinkList head = pHead;
pLinkList tmp = IfCircleList(pHead);
if (pHead==NULL&&tmp==NULL)
{
return NULL;
}
while (tmp != head)
{
tmp = tmp->_next;
head = head->_next;
}
return tmp;
}