您的位置:首页 > 其它

c 语言 单链表的操作 易考点

2015-10-29 17:04 369 查看
//头文件
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: