当前位置:首页 » 编程语言 » c语言链表冒泡排序

c语言链表冒泡排序

发布时间: 2023-03-11 14:13:45

c语言做链表的排序

主要修改了sort函数,采用冒泡排序算法进行排序的。
你其他的两个函数写的不错,就sort函数写的有问题,已经很不错了。
注意:程序结束,最好对链表进行销毁,否则,内存永远也不会释放,导致内存泄漏了。

修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define N 5
typedef struct node
{
char name[20];
int score;
struct node *link;
}stud;

stud *sort(stud *head) /*排序函数*/
{
stud *temp=NULL; //默认为NULL,也就是链表的结尾
stud *ptr1=head;
stud *ptr2=head->link;

while(ptr1->link!=temp)//(ptr1!=NULL)
{
//ptr2=ptr1->link; //放在循环体下面了
while(ptr2->link!=temp)//(ptr2!=NULL)
{
if(ptr1->link->score > ptr2->link->score) //(ptr1->score > ptr2->score)
{//交换 ptr1->link和ptr2->link,而不是ptr1和ptr2,否则无法交换
ptr1->link=ptr2->link;
ptr2->link=ptr2->link->link;//temp->link=ptr2;
ptr1->link->link=ptr2;//ptr2->link=ptr1;
}
ptr1=ptr1->link;//ptr2=ptr2->link;
ptr2=ptr1->link;//从上面移动下来的
}
temp=ptr2;//新加的
ptr1=head;//ptr1=ptr1->link;
ptr2=ptr1->link;//从上面移动下来的
}
return (head);
}

stud * creat(int n)
{
stud *p,*h,*s;
int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
s->link=NULL;//p->link=s; //跟下句对调了一下,为了把相关的代码放在一起
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
printf("请输入第%d个人的分数",i+1);
scanf("%d",&s->score);
p->link=s; //s->link=NULL;//跟上句对调了一下,为了把相关的代码放在一起
p=s;
}
return(h);
}

void print(stud *h)
{
stud *p;

p=h->link;
printf("数据信息为:\n");
while(p!=NULL)
{
printf("%s ",&*(p->name));
printf("的分数为%d\n",p->score);
p=p->link;
}
}

void main()
{
stud *head;
head=creat(N);
head=sort(head);
print(head);
getchar();
}

② C语言冒泡排序降序没问题,升序有问题,为什么

第1,冒泡算法是没有问题的,这是经过时间验证的算法。如果你的实现出了问题,肯定是你的实现有问题。
第2,单给一个结果,是看不出原因的。只能猜测是你的实现里,链表越界了。所以,你要想让别人帮你分析,就需要把源码发出来。

③ C语言链表如何实现冒泡排序

将链表地址存入一个数组,在内循环的比较阶段,取出数组地址对应的内容进行比较和排序,这样就可以实现链表冒泡排序了。。
这里假设你已经知道怎么进行冒泡排序编程了,所以仅作文字说明,不再写例子程序了。。

④ C语言 单向链表如何排序

void link_order(STU *p_head)

{

STU *pb, *pf, temp;

pf = p_head;

if(p_head == NULL) {//链表为空

printf("needn't order. ");

return ;

}

if(p_head->next == NULL) {//链表有1个节点

printf("only one print, needn't order. ");

return ;

}

while(pf->next != NULL) {//以pf指向的节点为基准节点

pb = pf->next;//pb从基准点的下一个节点开始

while(pb != NULL) {

if(pf->num > pb->num) {

temp = *pf;

*pf = *pb;

*pb = temp;

temp.next = pf->next;

pf->next = pb->next;

pb->next = temp.next;

}

pb = pb->next;

}

pf = pf->next;

}

return ;

}

(4)c语言链表冒泡排序扩展阅读:

链表的排序有三种情况:

1、链表为空时:不用排序;

2、链表中有一个节点:不用排序;

3、链表中两个及其以上节点时:排序。

return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。

return语句用来结束循环,或返回一个函数的值。

1、return 0,说明程序正常退出,返回到主程序继续往下执行。

2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。

热点内容
动态规划01背包算法 发布:2024-11-05 22:17:40 浏览:849
nasm编译器如何安装 发布:2024-11-05 22:01:13 浏览:181
登录密码在微信的哪里 发布:2024-11-05 22:00:29 浏览:739
c防止反编译工具 发布:2024-11-05 21:56:14 浏览:248
安卓虚拟机怎么用 发布:2024-11-05 21:52:48 浏览:344
php时间搜索 发布:2024-11-05 20:58:36 浏览:479
燕山大学编译原理期末考试题 发布:2024-11-05 20:13:54 浏览:528
华为电脑出现临时服务器 发布:2024-11-05 20:05:08 浏览:408
斗战神免费挖矿脚本 发布:2024-11-05 19:53:25 浏览:665
网吧服务器分别是什么 发布:2024-11-05 19:45:32 浏览:392