双向链表的排序



///双向链表排序,思路是: 把之前的链表依次检索出最小到放到新的链表的尾部,然后指向新的链表,就是来回倒弄指针.
#include <stdio.h>
#include <malloc.h>


typedef struct _BiNode
{
   int data;


   struct _BiNode *Next;
   struct _BiNode *Prev;
}BiNode;


BiNode *CreateBiList(int num)
{
   BiNode *ListHead;
   BiNode *ListCurr;
   BiNode *ListPrev;
   int i;
   if(num==0) return NULL;


   ListHead=(BiNode *)malloc(sizeof(BiNode));
   if(ListHead==NULL) return NULL;


   ListHead->data=0;
   ListHead->Next=NULL;
   ListHead->Prev=NULL;


   ListPrev=ListHead;
  
  for(i=1;i<num;i+=2)
  {
           ListCurr=(BiNode *)malloc(sizeof(BiNode));
           if(ListCurr==NULL) return ListHead;
           
  ListCurr->data=i;
  ListCurr->Prev=ListPrev;
  ListCurr->Next=NULL;


           ListPrev->Next=ListCurr;
  ListPrev=ListCurr;
   }
  for(i=2;i<num;i+=2)
  {
           ListCurr=(BiNode *)malloc(sizeof(BiNode));
           if(ListCurr==NULL) return ListHead;
           
  ListCurr->data=i;
  ListCurr->Prev=ListPrev;
  ListCurr->Next=NULL;


           ListPrev->Next=ListCurr;
  ListPrev=ListCurr;
   }


  return ListHead;
}


int printBiList(BiNode *BiList)
{
    BiNode *tmpList=BiList;
    int cnt=0;
if(BiList==NULL) return -1;


while(tmpList!=NULL)
     {
   printf("No %d BiNode is %d\n",cnt++,tmpList->data);
tmpList=tmpList->Next;
}
return 0;
}
BiNode *FindMinNode(BiNode *list)
{
BiNode *tmpNode;
BiNode *MinNode=NULL;


    if(list==NULL) return NULL;


MinNode=list;
    tmpNode=list->Next;
while(tmpNode!=NULL)
    {
 if(MinNode->data>tmpNode->data)
 {
 MinNode=tmpNode;
 }
 tmpNode=tmpNode->Next;
}
return MinNode;
}
int sortMin(BiNode *List)
{
     BiNode *NewList;
     BiNode *OldList;
     BiNode *MinNode;
     BiNode *NodePrev;


OldList=List;
     MinNode=FindMinNode(OldList);
if(MinNode==NULL)  return 0;


     if(MinNode->Next)
{
MinNode->Next->Prev=MinNode->Prev;    
     }
     if(MinNode->Prev)     
{
MinNode->Prev->Next=MinNode->Next;  
}
else
        OldList=MinNode->Next;///关键是这里,要把抽出来后的链表跳变


     MinNode->Next=NULL;
     MinNode->Prev=NULL;
     NewList=MinNode;
NodePrev=NewList;


while(OldList!=NULL) xxxxx
     {
      MinNode=FindMinNode(OldList);
      if(MinNode==NULL)  
  {  
  List= NewList; 
  return 0;
  }
  if(MinNode->Next)
  {
       MinNode->Next->Prev=MinNode->Prev;   
            }
            if(MinNode->Prev)     
{
        MinNode->Prev->Next=MinNode->Next;        
}
       else
               OldList=MinNode->Next; 

MinNode->Prev=NodePrev;
            MinNode->Next=NULL;    
NodePrev->Next=MinNode;  


NodePrev=MinNode;
}

    List= NewList; 
return 0;
}


int main()
{
   BiNode *BiList;


BiList=CreateBiList(20);


printBiList(BiList);


printf("-------------------sort after---------------------\n");


sortMin(BiList);
    printBiList(BiList);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值