百韵网 >>  正文

C语言单向链表排序?

来源:www.baiyundou.net   日期:较早时间
#include <stdio.h>
typedef struct Link/*双向链表结构体*/
{
int data;
struct Link *lift;
struct Link *right;
}linkx,*linky;
linky Init();/*建立双向链表*/
void PrLink(linky p);/*输出双向链表*/
linky Sort(linky head);/*对双向链表排序*/
linky Swap(linky head,linky one,linky two);/*任意交换双向链表两个结点的地址*/
void main(void)
{
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));
clrscr();
printf("please input 10 num: ");
scanf("%d",&p->data);/*输入数据*/
head->lift=NULL;
n++;
while(n!=10)/*一直输入到规定的数字个数停止*/
{
q=p;
p=(linky)malloc(sizeof(linkx));
scanf("%d",&p->data);/*输入数据*/
q->right=p;
p->lift=q;
n++;
}
p->right=NULL;
return(head);
}
linky Swap(linky head,linky one,linky two)/*任意交换两个结点*/
{linky temp;
if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交换*/
{
if(one->right==two)/*只有两个结点的情况下*/
{
two->right=one;
two->lift=NULL;
one->lift=two;
one->right=NULL;
head=two;
}
else/*有间隔的首尾交换*/
{
one->right->lift=two;
two->lift->right=one;
two->right=one->right;
one->lift=two->lift;
two->lift=one->right=NULL;
head=two;/*尾结点成为头结点*/
}
}
else if(two->right==NULL)/*尾和任意一个交换*/
{
if(one->right==two)/*交换最后两个结点*/
{
one->lift->right=two;
two->lift=one->lift;
two->right=one;
one->lift=two;
one->right=NULL;
}
else/*和前面其他结点交换*/
{
temp=two->lift;
temp->right=one;
one->lift->right=two;
one->right->lift=two;
two->lift=one->lift;
two->right=one->right;
one->lift=temp;
one->right=NULL;
}
}
else if(one->lift==NULL)/*头和任意一个交换*/
{
if(one->right==two)/*交换头两个结点*/
{
two->right->lift=one;
one->right=two->right;
one->lift=two;
two->right=one;
two->lift=NULL;
head=two;
}
else/*头结点和后面其他结点交换*/
{
temp=one->right;
temp->lift=two;
one->lift=two->lift;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=NULL;
head=two;/*交换的结点成为头结点*/
}
}
else/*当中的任意两个交换*/
{
if(one->right==two)/*交换连在一起的两个结点*/
{
temp=one->lift;
one->lift->right=two;
one->right->lift=two;
one->lift=two;
one->right=two->right;
two->right->lift=one;
two->right=one;
two->lift=temp;
}
else/*交换隔开的两个结点*/
{
one->lift->right=two;
one->right->lift=two;
one->lift=two->lift;
temp=one->right;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=one->lift;
}
}
return(head);
}
linky Sort(linky head)/*对链表排序*/
{
linky i,j,t,p;
int 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;
}
if(max!=i->data)/*如果没有找到比i小的结点*/
{
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();
}

因为你的t=l,而l是你刚刚申请的内存,里面没有任何数据。自然下面的循环就永远进不去了。
while(t->next!=NULL && t->next->data.sum>=p->data.sum)

你直接套插入排序的思想就好了,单向链表没其他方法的

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

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

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

相关要点总结:

15985293886:数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...
路美答:一、单链表的建立 有了动态内存分配的基础,要实现链表就不难了。所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:1、数据域:用来存储...

15985293886:c语言,中p->next->next合法么? p-data=q->data合法么?
路美答:如果考虑全面的话,有时候是不合法的,比如p所在的位置是链表的最后一个结点或者链表中有0个结点。当然大部分还是合法的,你可以编一个小程序运行一下,下面的是我编的一个小程序,你可以运行一下 我先说一下运行结果:当p结点后面有两个或两个以上的结点时,就能够准确的输出所有的值;当p结点后面...

15985293886:用C语言实现数据结构中常用算法,如对链表的操作、查找、排序等。
路美答:调试过的 没什么大的毛病 include <stdio.h> include <stdlib.h> include <iostream> typedef int ElemType;typedef struct LNode { ElemType date;struct LNode *next;}linklist,*link;/*构造链表*/// void IinitList(link &L){ if(L)delete L;L= (link)malloc(sizeof(LNode)) ;if (!

15985293886:用C语言编写利用线性表实现学生信息表,查找和排序
路美答:int fhcd();//返回链表长度 bool dqys();//遍历链表 bool czysdz(int i);//查找链表元素(按地址)bool czysz(int i);//查找链表元素(按值)bool crys(int pos,int i);//插入元素 bool scys(int pos,int i);//删除元素 bool px();//排序 ~dlb();//析构函数,用于释放空间 };//...

15985293886:c语言!!!程序设计:建立一个学生信息链表,包括学号,姓名,成绩.(实现添...
路美答:代码如下:/*用c语言链表编写一个学生信息系统程序,要求输出学生的学号,姓名,性别,学号,姓名,成绩(实现添加,删除,查询,排序,平均)*/ include <stdio.h> include <iostream> include <string.h> include <stdlib.h> using namespace std;const int n=5;/ nodeEntry : 节点数据类型 nodeADT...

15985293886:数据结构单链表的题目 希望有高人帮忙解答 谢谢!
路美答:为了提高效率,最后采用了下面的算法。思路如下:1.首先将单链表调整为前半部分为奇数,后半部分为偶数的序列;2.扫描链表,找到分界,拆分成两个子链表;3.对奇偶子链表排序;其中第一步算法:从头开始扫描,p指像当前节点,q指向后继;1.若p->data为奇数,则继续后移;2.若p->data为偶数,(1...

15985293886:顺序表和链表的基本操作,用C语言实现!
路美答:顺序存储的线性表的算法 include "stdio.h"include "stdlib.h"define Status int define OVERFLOW 0 define TRUE 1 define FALSE 0 define OK 1 define MAXSIZE 100 typedef int ElemType;typedef struct list {ElemType elem[MAXSIZE];int length;}SqList;void InitList(SqList &L){ L.length...

15985293886:数据结构单链表实验(c语言版)
路美答:/* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */Status visit(ElemType c){ printf("%d ",c); return OK;}typedef struct Node{ ElemType data; struct Node *next;}Node;typedef struct Node *...

15985293886:C语言排序
路美答:求各种排序的思路与C程序实例,要求思路详细(相当详细.),程序要有注释.最重要的是思路!我要算法思想详细描述!!!... 求各种排序的思路与C程序实例,要求思路详细(相当详细.),程序要有注释.最重要的是思路!我要算法思想详细描述!!! 展开  我来答

15985293886:C语言 学生成绩管理系统 用单链表
路美答:综合应用单链表和文件实现学生成绩管理,了解数据库管理的基本功能,掌握C语言的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。设计要求:1、使用单链表结构管理学生... 综合应用单链表和文件实现学生成绩管理,了解数据库管理的基本功能,掌握C语言的结构体、指针、函数(系统函数、自定义函数)、文件操作等知...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网