单向循环链表

    xiaoxiao2023-10-27  153

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

    最新回复(0)