/*
1:创建单向循环链表
2:遍历单向循环链表
3:单向循环链表节点插入
4:单向循环链表节点删除
5:单向循环链表倒序
6:单向循环链表排序
7:单向循环链表销毁
8:获取单链表的长度
9:单向循环链表判空
*/
#include <iostream>
using namespace std;
typedef struct node{
int value;
struct node *pNext;
}List;
/*创建单向循环链表*/
void Create(List* &Head,List* &End,int &NodeCount)
{
if(NodeCount <= 0) return ;
int nodevalue_ = 0;
List* node = NULL;
for(int i=0;i<NodeCount;i++){
cin>>nodevalue_;
node = new List;
node->value = nodevalue_;
node->pNext = NULL;
if(Head == NULL){
Head = node;
}
else{
End->pNext = node;
}
End = node;
}
End->pNext = Head;
}
/*遍历单项循环链表*/
void Traval(List* &Head,List* &End)
{
if (Head == NULL || End == NULL) return ;
List* ptr = Head;
while(ptr != End){
cout<< ptr->value<<" ";
ptr = ptr->pNext;
}
cout<< ptr->value<<endl;
}
/*获取单向链表的长度*/
void Length(List* &Head,List* &End,int &Length)
{
if (Head == NULL || End == NULL) {
Length = 0 ;
return ;
}
Length = 1;
List* ptr = Head;
while(ptr != End){
Length++;
ptr = ptr->pNext;
}
}
/*单向循环链表节点插入*/
void Insert(List* &Head,List* &End,int &InsertPos,int &InsertValue)
{
if ((Head == NULL || End == NULL) && InsertPos != 1) return ;
int length = 0;
Length(Head,End,length);
List* insertnode = new List;
insertnode->value = InsertValue;
insertnode->pNext = NULL;
if (InsertPos == 1 || (InsertPos == (++length))) {
insertnode->pNext = Head;
End->pNext = insertnode;
if(InsertPos == 1){
Head = insertnode;
}
else{
End = insertnode;
}
return ;
}
else{
int insertpos = 2;
List* InsertPrior = Head;
List* InsertNext = InsertPrior->pNext;
while(insertpos != InsertPos){
insertpos++;
InsertPrior = InsertPrior->pNext;
InsertNext = InsertNext->pNext;
}
insertnode->pNext = InsertNext;
InsertPrior->pNext = insertnode;
}
}
/*单向循环链表节点删除*/
void Del(List* &Head,List* &End,int &DelPos)
{
int length;
Length(Head,End,length);
if (Head == NULL || End == NULL || DelPos <=0 || DelPos > length) return ;
List* DelPrior = End;
List* DelNext = Head->pNext;
if (DelPos == 1 ){
End->pNext = DelNext;
delete Head;
Head = DelNext;
}
else {
DelPrior = Head;
DelNext = DelPrior->pNext->pNext;
int delpos = 2;
List* ptr = NULL;
while(delpos != DelPos){
DelPrior = DelPrior->pNext;
DelNext = DelPrior->pNext->pNext;
delpos++;
}
ptr= DelPrior->pNext;
DelPrior->pNext = DelNext;
if (ptr == End){
End = DelNext;
}
delete ptr;
ptr = NULL;
}
}
/*单向循环链表倒序*/
void Reverse(List* &Head,List* &End)
{
if(Head == NULL || End == NULL) return ;
List* ptr = Head,*ptr_next= NULL;
End->pNext = NULL;
while(ptr != End){
ptr_next = ptr->pNext;
ptr->pNext = End->pNext;
End->pNext = ptr;
ptr = ptr_next;
}
ptr = Head;
Head = End;
End = ptr;
End->pNext = Head;
}
/*单向循环链表排序*/
void Sort(List* &Head,List* &End)
{
if( Head == NULL || End == NULL) return ;
End->pNext = NULL;
int listlength = 0;
Length(Head,End,listlength);
List *node = Head,*node_pNext = node->pNext;
List *tmp = NULL;
List *node_prior = NULL;
int nflag ;
for(int i=0;i<listlength;i++){
nflag = 0;
node = Head;
node_pNext = Head->pNext;
node_prior = Head;
for(int j=0;j<listlength-i-1;j++){
if(node_pNext->value < node->value){
tmp = node_pNext;
node->pNext = node_pNext->pNext;
node_pNext->pNext = node;
if(node != Head){
node_prior->pNext = node_pNext;
}
if(node == Head){
Head = node_pNext;
}
if (node_pNext == End){
End = node;
}
tmp = node;
node = node_pNext;
node_pNext = tmp;
nflag = j+1;
}
node_prior = node;
node = node->pNext;
node_pNext = node->pNext;
}
if (nflag == 0 ){
break;
}
i = listlength - nflag - 1;
}
End->pNext = Head;
}
/*单向链表销毁*/
void Destroy(List* &Head,List* &End)
{
if(Head == NULL || End == NULL) return ;
List* ptr = Head,*ptr_next = NULL;
while(ptr != End){
ptr_next = ptr->pNext;
delete ptr;
ptr = NULL;
ptr = ptr_next;
}
Head = NULL;
End = NULL;
}
bool m_is_empty(List* &Head,List* &End)
{
if(Head == NULL && End == NULL) return true;
else return false;
}
int main()
{
List *Head = NULL ,*End = NULL;
int length = 0,nodecount = 0,insertpos = 0,insertvalue = 0,delpos = 0;
/*创建单向循环链表*/
cin>>nodecount;
Create(Head,End,nodecount);
Traval(Head,End);
Length(Head,End,length);
cout<<length<<endl;
/*单向循环链表插入节点*/
cin>>insertpos >> insertvalue;
Insert(Head,End,insertpos,insertvalue);
Traval(Head,End);
Length(Head,End,length);
cout<<length<<endl;
/*删除单向循环链表的节点*/
cin>>delpos;
Del(Head,End,delpos);
Traval(Head,End);
Length(Head,End,length);
cout<<length<<endl;
/*单向循环链表的倒序*/
Reverse(Head,End);
Traval(Head,End);
Length(Head,End,length);
cout<<length<<endl;
/*单向循环链表排序*/
Sort(Head,End);
Traval(Head,End);
Length(Head,End,length);
cout<<length<<endl;
/*单向循环链表判空*/
bool b_empty = m_is_empty(Head,End);
if(b_empty == true){
cout<<"is_empty"<<endl;
}
else{
cout<<"is_not_empty"<<endl;
}
/*销毁单向链表*/
Destroy(Head,End);
if(Head == NULL && End == NULL){
cout<<"is_empty"<<endl;
}
else{
cout<<"not_empty"<<endl;
}
system("pause");
return 0;
}
单向循环链表
最新推荐文章于 2022-11-09 15:10:43 发布