单向循环链表

/*
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值