双向循环链表

    xiaoxiao2023-11-17  144

    /* 双向循环链表     1:双向循环链表创建     2:双向循环链表长度     3:双向循环链表正向遍历     4:双向循环链表反向遍历     5:双向循环链表节点插入     6:双向循环链表节点删除     7:双向循环链表倒序     8:双向循环链表判空     9:双向循环链表排序     10:双向循环链表销毁 */

    #include <iostream> using namespace std; typedef struct node{     struct node *pFront;     int value;     struct node *pNext; }DCList; /*创建双向循环链表*/ void Create(DCList* &Head,DCList* &End,int &nodecount ) {     if(nodecount <=0)  return ;     DCList *node = NULL;     int nodevalue = 0;     for(int i=0;i<nodecount;i++){         cin>>nodevalue;         node = new DCList;         node->value = nodevalue;         node->pFront = node;         node->pNext = node;         if(Head == NULL){             Head = node;         }         else{             node->pNext = Head;             End->pNext = node;             node->pNext->pFront = node;             node->pFront = End;         }         End = node;     } } /*获取双向链表的长度*/ void Length(DCList* &Head,DCList* &End,int &length) {     length = 1;     DCList* ptr= Head;     while(ptr != End){         length++;         ptr = ptr->pNext;     } } /*双向链表正向遍历*/ void Traval(DCList* &Head,DCList* &End) {     if(Head == NULL || End == NULL)  return ;     DCList *ptr = Head;     while(ptr != End){         cout<<ptr->value<<" ";         ptr= ptr->pNext;     }     cout<<End->value<<endl; } /*双线循环链表的反向遍历*/ void ReTraval(DCList* &Head,DCList* &End){     if(Head == NULL || End == NULL)  return ;     DCList * ptr= End;     while(ptr != Head){         cout<<ptr->value<<" ";         ptr=ptr->pFront;     }     cout<<Head->value<<endl; } /*双向循环链表节点插入*/ void Insert(DCList* &Head,DCList* &End,int &InsertPos,int InsertValue) {     if((Head == NULL || End == NULL) && InsertPos != 1)  return ;     int length =0 ;     Length(Head,End,length);     if(InsertPos <=0 && InsertPos > length+1)  return ;     DCList *insertnode = NULL;     insertnode = new DCList;     insertnode->value = InsertValue;     int insertpos =1;     DCList* insertfront = End;     DCList* insertnext = Head;     while(insertpos != InsertPos){         insertfront = insertfront->pNext;         insertnext =  insertfront->pNext;         insertpos++;     }     insertnode->pNext = insertnext;     insertnode->pNext->pFront = insertnode;     insertfront->pNext = insertnode;     insertfront->pNext->pFront = insertfront;     if(InsertPos == 1){         Head = insertnode;     }     else if(InsertPos == length+1){         End = insertnode;     } } /*双向循环链表节点删除*/ void Del(DCList* &Head,DCList* &End,int &DelPos) {     if(Head == NULL || End == NULL)  return ;     int length =0;     Length(Head,End,length);     if(DelPos <= 0 || DelPos > length) return ;     DCList * delfront = End;     DCList * delnext =Head->pNext;     int delpos = 1;     while(delpos != DelPos){         delfront = delfront->pNext;         delnext = delnext->pNext;         delpos++;     }     DCList *ptr = delfront->pNext;     delfront->pNext = delnext;     delnext->pFront = delfront;     delete ptr ;     ptr = NULL;     if(DelPos == 1){         Head = delnext;     }     else if(DelPos == length){         End = delfront;     } } /*双向循环链表倒序*/ void Reverse(DCList* &Head, DCList* &End) {     if(Head == NULL || End == NULL)  return ;     DCList* Head_New = NULL;     DCList* End_New = NULL;     DCList *ptr = End;     DCList *ptr_front = NULL;     while(ptr != Head){         ptr_front = ptr->pFront ;         ptr->pFront = ptr;         ptr->pNext = ptr;         if(Head_New == NULL){             Head_New = ptr;         }         else{             ptr->pNext = Head_New;             End_New->pNext = ptr;             ptr->pNext->pFront = ptr;             ptr->pFront = End_New;         }         End_New = ptr;         ptr = ptr_front;     }     Head->pNext = Head_New;     Head->pFront = End_New;     Head_New->pFront = Head;     End_New->pNext = Head;     End_New = Head;     Head = Head_New;     End = End_New; } /*双向循环链表排序*/ void Sort(DCList* &Head,DCList* &End) {     if(Head == NULL || End == NULL)  return ;     DCList *node = NULL;     DCList* node_next = NULL;     DCList* node_front = NULL;     DCList* tmp = NULL;     int length = 0;     Length(Head,End,length);     int nflag =0;     for(int i=0;i<length;i++){         nflag = 0;         node = Head;         node_next = node->pNext;         node_front = Head;         for(int j=0;j<length-i-1;j++){             if(node->value > node_next->value){                 node->pNext = node_next->pNext;                 node->pNext->pFront = node;                 node_next->pNext = node;                 node_next->pNext->pFront = node_next;                 if(node != Head){                     node_front->pNext = node_next;                         node_next->pFront = node_front;                 }                 if(node == Head){                     Head = node_next;                     node_next->pFront = NULL;                 }                 if(node_next == End){                     End = node;                 }                 tmp = node;                 node = node_next;                 node_next = tmp;                 nflag = j+1;             }             node_front = node;             node = node->pNext;             node_next = node->pNext;         }         if(nflag == 0){             break;         }         i = length-nflag-1;     } } /*双向链表销毁*/ void Destroy(DCList* &Head,DCList* &End){     if(Head == NULL || End == NULL)        return ;     DCList * ptr = Head;     DCList* ptr_next = NULL;     while(ptr != End){         ptr_next = ptr->pNext;         delete ptr ;         ptr = NULL;         ptr = ptr_next;     }     delete End ;     End = NULL;     Head = NULL; } /*双向链表判空*/ bool m_is_empty(DCList* &Head,DCList* &End) {     if(Head == NULL || End == NULL)           return true;     else          return false; } int main(){     int length,nodecount,insertpos,insertvalue,delpos;     DCList *Head = NULL ,*End = NULL;     /*创建双循环链表*/     cin>> nodecount;     Create(Head,End,nodecount);     Traval(Head,End);     ReTraval(Head,End);     Length(Head,End,length);     cout<<length<<endl;     //cout<<End->pNext->value<<" "<<Head->pFront->value<<endl;     /*双向循环链表节点插入*/     cin>> insertpos >> insertvalue;     Insert(Head,End,insertpos,insertvalue);     Traval(Head,End);     ReTraval(Head,End);     Length(Head,End,length);     cout<<length<<endl;     /*双向循环链表节点删除*/     cin>> delpos ;     Del(Head,End,delpos);     Traval(Head,End);     ReTraval(Head,End);     Length(Head,End,length);     cout<<length<<endl;     /*双向链表倒序*/     Reverse(Head,End);     Traval(Head,End);     ReTraval(Head,End);     Length(Head,End,length);     cout<<length<<endl;     /*双向循环链表排序*/     Sort(Head,End);     Traval(Head,End);     ReTraval(Head,End);     Length(Head,End,length);     cout<<length<<endl;     /*双向循环链表判空*/     bool m_empty = m_is_empty(Head,End);     if(m_empty ){         cout<<"is_empty"<<endl;     }     else{         cout<<"is_not_empty"<<endl;     }     Destroy(Head,End);     m_empty = m_is_empty(Head,End);     if(m_empty ){         cout<<"is_empty"<<endl;     }     else{         cout<<"is_not_empty"<<endl;     }     system("pause");     return 0; }

    最新回复(0)