双向链表存储数据的冒泡排序法

/************************************************
 *   File name      two_direction_merge.c
 *   CopyRight      :2011-04-1,All rights Reserved.
 *   Module name    :...
     *
 *   CPU            :ARM7
 *   RTOS           :....
     *
 *   Create Date    :2011-03-24
 *   Author/Corporation:  hackerling/maple Corporation
 *
 *   Abstract Description :
 *
 *
 *   ---------------Revision History--------------
 *   No  Version  Date       Revised By   Item     Description
 *
 *
 **************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef struct link
{
 int data;
 struct link *left;
 struct link *right;
}linkx,*linky;
linky init(); //初始化双向链表
void prlink(linky head);  //打印
linky sort(linky head);  //排序
linky swap(linky head,linky one,linky two);  //任意交换双向链表两个节点的地址
void main()
{
 linky head;
 head=init();
    head=sort(head);
 prlink(head);
}

linky init()          //创建一个有十个元素的双向链表
{
  linky p,q,head;
  int n=0;
  head=p=q=(linky)malloc(sizeof(linkx));
  printf("please input 10 nums: \n");
  scanf("%d",&p->data);
  head->left=NULL;
  n++;
  while(n!=10)
  {
   q=p;
   p=(linky)malloc(sizeof(linkx));
   scanf("%d",&p->data);
   q->right=p;
   p->left=q;
   n++;
  }
  p->right=NULL;
  return head;
}

linky swap(linky head,linky one,linky two)      //任意交换两个节点
{
 linky temp;
 if(one->left==NULL&&two->right==NULL)     //首尾节点的交换
 {
  if(one->right==two)   //只有两个节点
  {
   two->right=one;
   two->left=NULL;
   one->right=NULL;
   one->left=two;
   head=two;
  }
  else            //其他的情况
  {
   one->right->left=two;
   two->left->right=one;
   two->right=one->right;
   one->left=two->left;
   two->left=NULL;
   head=two;
  }
 }
 else if(two->right==NULL)   //尾节点与任意节点的交换
 {
  if(one->right==two)      //最后两个节点
  {
   one->left->right=two;
   two->right=one;
   two->left=one->left;
   one->right=NULL;
   one->left=two;
  }
  else                   //交换其他节点和最后一个节点
  {
   temp=two->left;
   temp->right=one;
   one->left->right=two;
   one->right->left=two;
   two->left=one->left;
   two->right=one->right;
   one->left=temp;
   one->right=NULL;
  }
 }
 else if(one->left==NULL)   //头结点与其他节点交换
 {
  if(one->right==two)  //头两个节点交换
  {
   two->right->left=one;
   one->right=two->right;
   one->left=two;
   two->left=NULL;
      two->right=one;
   head=two;
  }
  else
  {
   temp=one->right;
   temp->left=two;
   one->left=two->left;
   one->right=two->right;
   two->left->right=one;
   two->right->left=one;
   two->right=temp;
   two->left=NULL;
   head=two;
  }
 }
 else       //交换当中任意的两个节点
 {
  if(one->right==two)
  {
   temp=one->left;
   one->left->right=two;
   one->right->left=two;  //这条语句貌似不用
   one->left=two;
   one->right=two->right;
   two->right->left=one;
   two->right=one;
   two->left=temp;
  }
  else
  {
   temp=one->right;
   one->left->right=two;
   one->right->left=two;
      two->left->right=one;
   two->right->left=one;
   one->right=two->right;
   two->right=temp;
   temp=one->left;
   one->left=two->left;
   two->left=temp;
  }
 }
 return(head);
}
linky sort(linky head)
{
 linky i,j,t,p;
 int max;   //表示当前值为最大值,找出比它小的最小值,赋值给max(这里的max成了

//比当前值小的数里边最小的)
 p=head;
 for(i=p;i->right!=NULL;i=i->right)  //逐一扫描所有双向链表的数据
 {
  max=i->data;
  for(j=i->right;j!=NULL;j=j->right)

{
   if(j->data<max)
   {
    max=j->data;
    t=j;   //用t做临时结构体指针变量,指向比当前值小的那个最小值
   }

}
   if(max!=i->data)    //如果不相等,则交换两个结点
   {
    head=swap(head,i,t);
    i=t;
   }
 }
 return head;
}
void prlink(linky p)
{
 linky q;
 printf("Now the link: ");
 do
 {
  q=p;
  printf("%d",p->data);
        p=p->right;
  free(q);
 }
 while(p!=NULL);
 getch();
}

 

 

 

 

 

 

 
 

你可能感兴趣的:(职场,双向链表,休闲,存储数据,冒泡排序法)