//注意(1)最小的数字可能不止一个 如 2 3 4 1 1 1 6
//注意 (2)最小的数字如果在末位怎么办
//注意(3)最小的数字如果在开头怎么办
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int num;
struct node* next;
}NODE,*PNODE;
PNODE creat_(int n)//建立循环双向链表
{
int num_;
PNODE head,p,q;
head=(PNODE)malloc(sizeof(NODE));
if(head==NULL)
{
cout<<"fault";
}
head->next=NULL;
q=head;
while(n--)
{
p=(PNODE)malloc(sizeof(NODE));
cin>>num_;
p->num=num_;
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
void traverse(PNODE head)
{
PNODE q=head->next;
while(q!=NULL)
{
cout<<q->num<<' ';
q=q->next;
}
}
void find(PNODE head)
{
int i;
int count=0;
PNODE new_;
PNODE q=head->next;
i=q->num;
q=q->next;
while(q!=NULL)//寻找最小数字i
{
if(i>q->num)
{
i=q->num;
}
q=q->next;
}
q=head->next;
while(q!=NULL)//找出有几个最小的数字
{
if(q->num==i)
count++;
q=q->next;
}
q=head->next;
if(q->num==i)//如果开头就是最小的数字的话找到最小数字的次数就减1
{
count=count-1;
}
while(count--)//找最小数字的次数
{
while(q->next!=NULL && q->next->num!=i)//如果前面的数都不满足,则最后一个q则是最小数字
{
q=q->next;
}
if(q->next==NULL)//如果最小数字在末位
{
new_=(PNODE)malloc(sizeof(NODE));
new_=q;
new_->next=head->next;
head->next=new_;
free(q);//释放最小数字内存
}
else//如果不在末位
{
new_=(PNODE)malloc(sizeof(NODE));
new_=q->next;
q->next=q->next->next;
new_->next=head->next;
head->next=new_;
}
}
}
int main()
{
PNODE head;
head=creat_(7);
find(head);
traverse(head);
}