c语言链表排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言链表排序相关的知识,希望对你有一定的参考价值。

请教高手,提供一个c语言链表排序的实例吧,不要太长,谢谢啊,急哦

#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef long LElemType; //学号变量类型
typedef float FElemType; //成绩变量类型
typedef int Status; //返回值的类型
typedef struct student

LElemType num;
FElemType score;
student *next;
node;
typedef struct LIST

node *head,*tail;
link;
node *MakeNode(long num, float score) //生成存放学生信息的节点

node *p=(node *)malloc(sizeof(node));
p->num = num; //存放学号
p->score = score; //存放分数
p->next = NULL; //刚生成的节点下一个为空
return p;

Status Create(link *s,int n)

long num;
float score;
s->head = s->tail = MakeNode(0,-1); //头结点num用来存放学生信息条数。score空着不用
if(NULL == s->head)

puts("分配失败!");
return ERROR;

for(int i=0; i<n; i++) //录入n个学生的信息

printf("请输入第%d个学生的信息(学号与成绩): ",i);
scanf("%d%f",&num,&score);
node *p = MakeNode(num,score);
s->tail->next = p;
s->tail = p;
s->head->num++; //修改头结点中存放学生信息条数每增加一个节点就要++1

return OK;

Status display(link *s)

node *p = s->head->next; //让p指针指向头结点的下一个节点,因为头结点只用来存放了学生的人数
while(p)//只要p指针指向不为空就要输出

printf("%d %.2f\n",p->num,p->score);
p = p->next;

return OK;

//按照成绩升序排序
Status SortByScore(link *s)

int n = s->head->num;
node *p,*cur,*next;
for(int i=0; i<n-1; i++)

p= s->head;
cur=p->next;
next = cur->next;
for(int j=0; j<n-1-i; j++)

if(next->score<cur->score)

p->next=next;
cur->next = next->next;
next->next = cur;

p=next;
next=cur->next;
else
p=cur;
cur = next;
next = next->next;



return OK;

int main()

link s;
int n;
printf("你想录入多少学生的记录:n=");
scanf("%d",&n);
Create(&s,n);
puts("所有学生的信息(学号与成绩): ");
display(&s);
SortByScore(&s);
puts("按成绩升序排序好的所有学生的信息(学号与成绩): ");
display(&s);
return OK;
参考技术A //---------------------------------------------------------------------------
//---------------------------------------------------------------------------

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

typedef struct np
int dat;
struct np *left,*right;
node;
node *create(void)

return (malloc(sizeof(node)));

node *t(node *a,int d)

if (a==NULL)
a=create();
a->left =a->right =NULL;
a->dat=d;

else if (d>=a->dat)
a->right =t(a->right,d);

else if (d<a->dat)
a->left =t(a->left ,d);

return a;

void inorder(node *r)

if (r!=NULL)
inorder(r->left );
printf("%d ",r->dat );
inorder(r->right );



int main(void)

node *bst=NULL;

int i;

while (!feof(stdin))/*ctrl+z或者ctrl+d结束输入*/

scanf("%d",&i);
bst=t(bst,i); /*生成二叉排序数*/


inorder(bst); /*输出二叉排序树*/
putchar('\n');

return 0;

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
参考技术B 我回答了这个问题,与你的问题有关,里面有一个具体实现:
http://zhidao.baidu.com/question/77764853.html

关于C语言链表的问题,一个排序的问题,按num排序,求大佬帮助,在线等~!有点急~!

struct student//结构体数据域

char name[10];
double score;
char num[10];
;
struct node//结构体的结构体

struct student data;//数据域
struct node *next;//指针域
;
------------------------------------以上是结构体的内容
struct node *sort(struct node*head)//排序函数

int len = 0, i;
char temp[10];
struct node *q=head;
while (q!=NULL)

len++;
q = q->next;

for (i=0;i<len;i++)

if (q->next == NULL)

return;

else

if (strcmp(q->data.num, q->next->data.num) == 1)


temp = q->data.name;





return p;
//这是我写的排序,我不会写,求大佬帮助一下,最好有注释解释下,我是萌新,刚学,拜托拜托,

你的代码似乎不能完成链表排序。给你写一个选择法排序的供参考——

#include "stdio.h"
#include <string.h>
struct student//结构体数据域
char name[10];
double score;
char num[10];
;
struct node//结构体的结构体
struct student data;//数据域
struct node *next;//指针域
;
struct node *sort(struct node *head)//排序函数
struct node *p,*q,*t;
struct student x;
for(p=head;p;p=p->next)
for(t=p,q=t->next;q;q=q->next)
if(strcmp(t->data.num,q->data.num)==1)
t=q;
if(t-p)
x=p->data,p->data=t->data,t->data=x;

return head;

int main(int argc,char *argv[])//测试主函数
struct node A[5]="AAA",68.9,"10101",&A[1],"BBB",88.3,"13101",&A[2],
                  "CCC",78.0,"11109",&A[3],"DDD",88.1,"19141",&A[4],
                  "EEE",99.5,"10008",NULL;//模拟了个长度为5的无头链表
int i;
printf("Before ordering:\\n");
for(i=0;i<5;i++)
printf("%s: %s\\t%.2f\\n",A[i].data.name,A[i].data.num,A[i].data.score);
sort(A);//调用自定义排序函数
printf("\\nAfter ordering:\\n");
for(i=0;i<5;i++)
printf("%s: %s\\t%.2f\\n",A[i].data.name,A[i].data.num,A[i].data.score);
return 0;

运行样例:

追问

谢谢大佬!

参考技术A #include <stdio.h>
#include <stdlib.h>
typedef struct node
 int value;
 struct node *link;
 NODE;
void insert(NODE**,int);
void print(NODE*);
void free_node(NODE*);
NODE* creat(int);
int main(void)
 NODE *header=NULL;
 int value;
 printf("Input values separated by space:\\n");
 while(scanf("%d",&value))
  insert(&header,value);
  if(getchar()=='\\n') break;
 
 printf("Here are the values in sort:\\n");
 print(header);
 free_node(header);
 return 0;

void insert(NODE **header_p,int value)
 NODE *current,*previous,*new;
 new=creat(value);
 previous=NULL;
 current=*header_p;
 while(current!=NULL&&current->value<value)
  previous=current;
  current=current->link;
 
 if(current==*header_p)
  *header_p=new;
  new->link=current;
 else if(current==NULL)
  previous->link=new;
  new->link=current;
 else
  previous->link=new;
  new->link=current;
 

void print(NODE *header)
 NODE *current;
 current=header;
 while(current != NULL)
  printf("%d ",current->value);
  current=current->link;
 

void free_node(NODE *header)
 NODE *current,*next;
 current=header;
 while(current->link != NULL)
  next=current->link;
  free(current);
  current=next;
 
 free(current);

NODE* creat(int value)
 NODE *new;
 new=(NODE *)malloc(sizeof(NODE));
 new->value=value;
 return new;

参考技术B LinkList Sort(LinkList SL)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/

LinkList p,q;
int temp;
for(p=SL;p!=NULL;p=p->next)

for(q=p->next;q!=NULL;q=q->next)

if(p->data>q->data)

temp=q->data;
q->data=p->data;
p->data=temp;



return SL;

如题按NUM排序,所以没有交换节点,只交换了数据,本质就是冒泡排序
如果交换节点在判断内就是
LinkList Sort(LinkList SL)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/

LinkList p,q,s;
int temp;
s = SL
for(p=SL;p!=NULL;p=p->next)

for(q=p->next;q!=NULL;q=q->next)

if(p->data>q->data)

p->next = q->next;
q->next = p;
s->next = q;
p = q;


if(s=SL)
SL = s;
s = p;
else
s = P;


return SL;

(网上粘贴,难得写了)

以上是关于c语言链表排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言的链表怎么排序

c语言链表排序

链表选择排序的C语言算法实现

c语言对链表的数据排序的问题,分不是问题!

关于C语言链表的问题,一个排序的问题,按num排序,求大佬帮助,在线等~!有点急~!

C语言如何对链表的数进行排序?