C语言,链表怎么从大到小排序

作者&投稿:弋钩 (若有异议请与网页底部的电邮联系)
C语言单向链表排序如何实现?~

struct student* printf_sort(struct student *head)
{
struct student *p1,*p2,*ptemp,*pfinished=NULL;
for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
//ptemp作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!=pfinished;)
{
if(p2->numnext->num)//p2的值小于p2->next的值,交换{
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
ptemp=p1;
}
else
{
ptemp->next=p2->next;
ptemp=p2->next;
p2->next=ptemp->next;
ptemp->next=p2;
}
}
else//不需要交换,则p2、ptemp前进1位
{
ptemp=p2;
p2=p2->next;
}
}
pfinished=p2;
}
}

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 ;
}

扩展资料:链表的排序有三种情况:
1、链表为空时:不用排序;
2、链表中有一个节点:不用排序;
3、链表中两个及其以上节点时:排序。
return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。

//创建data型结构,为生成链表做准备
struct data
{
int value;
data *next;
};

//对链表进行排列的函数
void line(data *p,int n)
{ int temp,i,j;
data *tp;
for(i=0;i<n-1;i++)
for(j=0,tp=p;j<n-i-1;j++,tp=tp->next)
{ if(tp->value>tp->next->value)
{temp=tp->next->value;
tp->next->value=tp->value;
tp->value=temp;
}
}
}
以上是冒泡法对链表排序的例子;
//输出答案的函数
void answer(data *p)
{ while(p!=NULL) {
cout<<p->value<<endl;
p=p->next;

}
}
以上是遍历链表的函数p是链表的头指针

汗!你插入节点时干什么去了???

用链表不用数组基本上就是为了两件事:
不受数组大小的限制、不需要“排序”(如果各个节点可以进行排序的话)

所以,如果你先把节点都一口气插入到了链表里,再考虑如何进行排序的话,那么你使用链表的意义已经丧失了一半!而且链表排序的效率明显不及数组。故建议你在插入新节点的时,应将其插入到“适当”位置,这样在增加新节点的同时,还能保证链表有序,因此根本不需要在后面进行排序!

修改你的插入节点的算法吧!虽然每次插入节点稍微麻烦些,但也绝对比你先一口气插入了全部节点再排序高效的多!

不得哦,,链表的优点就是 不用预先定义大小,随时插入,随时删除,很方便的,,

缺点就是 排序和 查找(其中 排序最麻烦,)、

一般的做法是 定义一组数组,把链表的内容一次赋值给数组,
然后 利用(冒泡或者快速排序)数组排序,,
显示就可以了~~
虽然比较麻烦,,但是 比链表直接排序要 简单多了~

如果对空间要求不高,可以先导入到一个数组里面执行快速排序,再放回到原来的链表。
如果用N^2的排序算法,直接在链表执行就可以了,复杂度不会低的。


C语言单向链表排序如何实现?
struct student* printf_sort(struct student *head)\\x0d\\x0a{\\x0d\\x0astruct student *p1,*p2,*ptemp,*pfinished=NULL;\\x0d\\x0afor(p1=head;p1->next!=pfinished;)\/\/对链表进行从大到小排序(这里用冒泡法)\\x0d\\x0a\/\/p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点\\...

c语言链表排序 从 if(head == NULL||head->zfzf)开始 有点看不懂 求...
\/\/首先说这是一个从大到小的排序 if(head == NULL||head->zfzf)\/\/如果是第一次输入,或者输入的总分比头还大 { s->next=head;\/\/就将s放在头的前面,最为做大 head=s;\/\/然后让head指针重新指向头部最大 } else { p=head;\/\/如果不是比头大,将p指向头指针,方便指针移动比较后,能够...

c语言,链表究竟有多难?老师没教这部分。想自己学,但不知道能不能学会...
可以先学习建立一个静态链表,然后建立一个动态的单链表,再然后双链表。总之需要一步一步慢慢来。

一口气玩转链表(C语言版)
节点与头结点链表中的每个元素被称为节点,包含数据域和指针域。头结点并非必需,但用于标识链表的起始位置。在C语言中,可以定义一个结构体来表示节点,如头结点的创建和使用。链表操作创建链表后,可以进行增删查改操作。向链表添加元素、删除指定元素、查找数据以及更新元素都有特定的步骤和实现代码,这些...

求c语言双向循环链表的一个应用例子
排序做例子。比如。有10个数。从大到小排序成有序数组a[0]~a[9]这时如果加入第11个数时要要保序新的数组有序,假设这个值要插在第a[n] n<9;那就意味 着插入前要把a[n]-a[9]的位置向后移一位,在插入a[n]这样。要操作的指令就多了。用链表的话只要对要插入N个结点及附近的结点信息...

麻烦讲解一下C语言中的链表
首先单链表最基本要有一个数据区和一个指向区如下 ___| 数据区 | 指向区 | ———每个这样的结构称之为一个节点。每个节点又指向区连接。这样通过链表的第一个几点地址就可以找到整个链表的节点从而获取节点中的数据了。上面说的是最基本的链表,也称之为裸链表 双向链表和单链表类似...

C语言问题:链表中p=p->link 是什么意思?
从你写的来看,p是一个结构指针,指向的是链表的某个节点。这里link是节点的成员,从表达式看link是链表指针,p->link表示当前节点(p)的下一个节点。所以p=p->link,p初值是链表头节点的话,那么这个表达式放在循环中,就是依次获取链表的所有节点。

C语言中的链表排序问题
link beforep,p,p1,k,beforek,temp;if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\\n"); \/\/表头节点为空即链表为空 else {p=head; \/\/指针p指向表头 while(p->next!=NULL) \/\/当链表没有遍历完执行循环体 { k=p; \/\/指针k指向指针p p1=p->next; \/\/指...

怎样在C语言中正确运用链表??链表的使用需要注意哪些要点??
1.使用链表时候,先确认要使用的是单向链表,还是双向链表,或者是循环链表。一定要初始化。2.添加节点时候,要注意是否队列已满。3.删除节点的时候,要注意队列是否为空。4.要有可以判断链表是否为空的函数。5.要有可以判断链表节点个数的函数。

计算机专业的学生如何提高就业能力
2、数据结构与算法:链表,队列,堆,二叉树,排序,查找,贪心,回溯等。推荐配合某个具体语言食用,感受数据结构与算法的美。 3、操作系统:进程与线程,乐观锁与悲观锁,缓存一致性,CPU时间片调度,工作中常常用到高并发以及高数据库读写的情况,熟悉操作系统才能开发出更好的方案。 4、计算机网络:工作中会开发各种接口以...

昌图县19531634448: C语言链表排序 -
管炊复方: /* ==========================功能:直接插入排序(由小到大)返回:指向链表表 头的指针 ========================== */ /*直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学...

昌图县19531634448: C语言单向链表排序如何实现? -
管炊复方: struct student* printf_sort(struct student *head) { struct student *p1,*p2,*ptemp,*pfinished=NULL; for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法) //p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面...

昌图县19531634448: C语言 自定义函数 链表排序 -
管炊复方: 用插入排序做了一下#include typedef struct data { int value; struct data *next; }data; int sort_link(data **op_list) { data *p1 = NULL; // 当前待排序的节点 data *p2 = NULL; // 待排序链表表头 data *q = NULL; // 有序链表表头 data *t1 = NULL; // 插...

昌图县19531634448: C语言中,创建的链表怎么排序!
管炊复方: 先创建一个结构体,内容包括编号,姓名, 然后,再对姓名进行排序 ,排序方法有选择法,冒泡法,等都可以, 最后再输出

昌图县19531634448: 怎么用C语言写单链表的排序
管炊复方: 从键盘输入不定数量的数字构造链表,输入0结束,然后排序输出,代码如下:#include <stdio.h>#include <stdlib.h>#include <conio.h>typedef struct _list { int val; struct _list* next;} *node, list;/* 插入节点 */node Insert( node* head, node pos, int ...

昌图县19531634448: 编写程序创建一下链表并输入,对链表进行排序,从大到小 -
管炊复方: //输入n等于5 //连续输入5个数据 20 12 25 10 30 //从大到小排序后是 30 25 20 12 10 #include <stdio.h> #include <stdlib.h>struct linkNode {int data;struct linkNode *next; }; typedef struct linkNode *Link;Link CreateLink(int n) //创建链表 {Link ...

昌图县19531634448: C语言 链表怎么排序 急求大虾
管炊复方: 你稍微改动下,应该可以,算法是一样的 void order() { t=head; p=head; // r=head;//head是原链表的头 u=0; //t指向链表中score最大的一个链 while(p->next!=0) { if(p->next->score > t->score) { t=p->next; u=p; } // if(p!=head)r=r->next;//r比p少前进一次...

昌图县19531634448: 求C语言高手指导 用链表怎样排序(链表中有一个p - >score变量作为比较大小排序的标准) -
管炊复方: #include<stdio.h>#include<malloc.h>#include<string.h> struct node { char data[20] ; struct node*link ; }; typedef struct node ListNode ; void ListInsert(ListNode**L,char x[]) //构造链表时直接排序 { ListNode *p, *q, *curr ; p = (ListNode*)malloc(sizeof(...

昌图县19531634448: C语言 单向链表如何排序? -
管炊复方: void link_order(STU *p_head) { STU *pb, *pf, temp; pf = p_head; if(p_head == NULL) {//链表为空 printf("needn't order.\n"); return ; } if(p_head->next == NULL) {//链表有1个节点 printf("only one print, needn't order.\n"); return ; } while(pf->next !...

昌图县19531634448: C语言链表如何排序
管炊复方: 可以把链表设计成循环链表,用冒泡排序 在排序前设计一个交换标记,如在循环过程中有交换,则修改这个标记变量,如果在一次循环(当前节点为刚开始时节点,表示循环了一次)中,交换标记没有被修改,则表明该数列已排好序. 现在给...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网