【实际应用】用冒泡法给链表排序

/*-------------------------------------------------------预处理命令-----------------------------------------------------*/

#include<stdio.h>

#include<stdlib.h>

/*--------------------------------------------------全局声明部分---------------------------------------------------*/

struct link_list

{

 int data;

 struct link_list *next;

};

 

struct link_list *creat_linklist(void);

int show_linklist(struct link_list *s);

void del_linklist(struct link_list *s);

void incert_node(struct link_list *s,int a);

void data_incert_node(struct link_list *s,int _data);

struct link_list *sort_linklist(struct link_list *s,int n);

/*-------------------------------------------------------主函数-----------------------------------------------------*/

int main(void)

{

 int n=0;

 struct link_list *start;

 start=creat_linklist();

 n=show_linklist(start);

 incert_node(start,3);

 n=show_linklist(start);

 data_incert_node(start,4);

 n=show_linklist(start);

 start=sort_linklist(start,n);

 n=show_linklist(start);

 del_linklist(start);

 

 getchar();

 return 0;

}

/*--------------------------------------------------尾插法创建链表--------------------------------------------------------*/

struct link_list *creat_linklist(void)

{

 struct link_list *s,*x,*c;

 int _data,i=0;

 

 s=x=c=NULL;

 printf("Please input data:");

 scanf("%d",&_data);

 

 while(_data!=-1)/*用输入的值控制链表的创建*/

 {

  i++;

  c=(struct link_list *)malloc(sizeof(struct link_list));/*创建结点,*/

  if(s==NULL)/*如果链表头指针还没有指向任何结点,让头指针指向新申请的空间*/

  {

   s=c;

  }

  c->next=NULL;/*让申请到的结点中的地址域,指向空*/

  x->next=c;

  x=c;

  c->data=_data;

  printf("%d:",i);

  scanf("%d",&_data);

 }

 

 

 return s;

}

/*--------------------------------------------------输出链表--------------------------------------------------------*/

 

int show_linklist(struct link_list *s)/*输出链表的每个结点*/

{

 int i=0;

 

 while(s)

 {

  i++;

  printf("%d/t",s->data);

  s=s->next;

 }

 printf("/n");

 

 return i;/*返回链表的结点数*/

}

/*------------------------------------------在指定位置 insert node------------------------------------------------*/

void incert_node(struct link_list  *s,int a)/*在链表的第a个结点处插入一个新的结点*/

{

 int i=0;

 struct link_list *in,*rem,*temp;

 

 rem=s;

 in=(struct link_list*)malloc(sizeof(struct link_list));

 in->next=NULL;

 printf("Please input node_data:/n");

 scanf("%d",&in->data);

 

 while(rem&&i<a-1)/*找到指定位置前一个node*/

 {

  rem=rem->next;

  i++;

 }

 

 if(!rem||i>a-1)/*如果结点rem不等于空或变量i大于a-1的情况下执行下面的程序块*/

 {

  printf("The node is error!/n");

  return;

 }

 else/*否则将创建的节点插入预定位置*/

 {

  in->next=rem->next;/*新结点的地址域与rem的地址域一致*/

  rem->next=in;/*rem指向新节点*/

 }

 return;/*插入新结点完成,返回主调函数*/

}

 

/*------------------------------------------根据数据域大小 insert node------------------------------------------------*/

 

void data_incert_node(struct link_list *s,int _data)/*另一个插入结点的方法*/

{

 struct link_list *x,*temp;

 

 x=(struct link_list*)malloc(sizeof(struct link_list));/*创建新节点*/

 x->data=_data;

 while(s)/*结点值为非空就可以继续循环*/

 {

  temp=s;

  s=s->next;

  if(x->data<s->data)/*判断新节点与链表中各节点的大小关系  符合判断关系式的将节点插入链表*/

  {

   temp->next=x;

   x->next=s;

   break;

  }

  else if(temp->next==NULL)/*不符合条件的链表位向下一结点走一步*/

  {

   x->next=temp->next;

   temp->next=x;

   break;

  }

 }

 return;

}

/*--------------------------------------------------链表排序--------------------------------------------------------*/

struct link_list *sort_linklist(struct link_list *s,int y)/*关键的地方到了,我整了3天才弄出来的*/

{

 struct link_list *temp,*x,*first;/*声明3个结构型的指针变量*/

 int i=0;

 

 

 x=first=s;/*两个变量都指向链表的头结点*/

 

 for(i=0;i<y;i++)/*按冒泡法建立外循环*/

 {

  temp=first;/*temp在每一次都从第一结点开始*/

  s=x=temp->next;/*而指针s和指针x都指向第一结点的内存*/

  while(s->next!=NULL)/*s的地址域为空时终止循环*/

  {

   if(x->data<s->next->data)/*做逆序排列*/

   {

    s=s->next;/*s指向x的下一链表位置*/

    temp->next=s;/*temp所指链表的地址域指向s所指链表结点位置*/

    x->next=s->next;/*x地址域中的地址更新为两个比较结点后的结点地址*/

    s->next=x;/*两个链表中比较值大的一个指向值小的链表结点位置*/

    s=x;/*让两个指针指向同一链表结点*/

    temp=temp->next;/*temp继续向前一步走*/

   }

   else/*不符合条件的情况下所有指针地址向前一步走*/

   {

    temp=temp->next;

    s=x=temp->next;

   }

  }

 

 }

 return first;

}

/*--------------------------------------------------释放链表--------------------------------------------------------*/

void del_linklist(struct link_list *s)

{

 struct link_list *second;

 second=s;

 

 while(s)/*逐步释放链表的每个结点*/

 {

  second=s->next;

  free(s);

  s=second;

 }

 printf("%x/t%x/n",s,second);

 return ;

}

 

 

 

运行过几次感觉没什么问题了

 

有不足的地方请大家

 

无情的指出!

 

谢谢

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值