C语言链表中如何实现对一组数据进行排序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言链表中如何实现对一组数据进行排序?相关的知识,希望对你有一定的参考价值。
这个是我曾经编写的一个管理里面的一个模块就是按链表的某个变量进行排序的
希望您能看明白
Ranking_inquires(struct
student
*head)
int
B=A,i=0;
struct
student
*temp=head;
struct
student
*p=head;
struct
student
*q=head;
printf("\t\t
按总分
名次查询
\n
");
printf("姓名
总分
名次\n");
while(p->next!=NULL&&A>1)//根据成员的成绩对结构体
进行排序
p->sum=p->math+p->English+p->chinese+p->computer;
q=p->next;
p=p->next;
while(q->next!=NULL)
q=q->next;
if(p->sum
sum)
h.stu_id1=p->stu_id;
strcpy(h.name1,p->name);
h.English1=p->English;
h.computer1=p->computer;
h.math1=p->math;
h.sum1=p->sum;
h.chinese1=p->chinese;
p->stu_id=q->stu_id;
strcpy(p->name,q->name);
p->English=q->English;
p->computer=q->computer;
p->math=q->math;
p->sum=q->sum;
p->chinese=q->chinese;
q->stu_id=h.stu_id1;
strcpy(q->name,h.name1);
q->English=h.English1;
q->computer=h.computer1;
q->math=h.math1;
q->sum=h.sum1;
q->chinese=h.chinese1;
A--;
++i;
p->ranking=i;
这个是定义的全局变量
int
A=0;
int
cc;
struct
student
int
stu_id;
char
name[20];
float
English;
float
computer;
float
chinese;
float
math;
float
sum;
int
ranking;
struct
student
*next;
;
struct
stu
int
stu_id1;
char
name1[20];
float
English1;
float
computer1;
float
chinese1;
float
math1;
float
sum1;
h; 参考技术A #include
#include
#define
NULL
0
struct
student
*
creat();
struct
student
*
link(struct
student
*
head_a,struct
student
*
head_b);
void
print(struct
student
*
head);
struct
student
int
num;
float
score[2];
struct
student
*next;
stu;
int
main(void)
struct
student
*head_a;
struct
student
*head_b,*head_c;
printf("请输入a链表学生的数据:0
0
0结束输入\n");
head_a=creat();
print(head_a);
printf("请输入b链表学生的数据:0
0
0结束输入\n");
head_b=creat();
print(head_b);
head_c=link(head_a,head_b);
printf("打印经过排序之后的学生数据,a,b链数据的结合\n");
print(head_c);
return
0;
struct
student
*
creat()
int
n=0;
struct
student
*
head,*p1,*p2;
p1=p2=(struct
student
*)malloc(sizeof(struct
student
));
scanf("%d%f%f",&p1->num,&p1->score[0],&p1->score[1]);
head=NULL;
while(p1->num!=0)
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct
student
*)malloc(sizeof(struct
student));
scanf("%d%f%f",&p1->num,&p1->score[0],&p1->score[1]);
p2->next=NULL;
return
head;
void
print(struct
student
*
head)
struct
student
*p;
p=head;
while(p!=NULL)
printf("%-10d%-10.1f%-10.1f\n",p->num,p->score[0],p->score[1]);
p=p->next;
return
;
struct
student
*
link(struct
student
*
head_a,struct
student
*
head_b)
int
n,m;
m=n=0;
struct
student
*
head,*p1,*p2,*p3,*q;//q是在冒泡排序是(共需N-1趟排序)每趟的最后一次指针p1的位置,开始时q为Null
p1=head_a;
p2=head_b;
head=head_a;
while(p1->next!=NULL)
p1=p1->next;n++;
p1->next=p2;
p1=head_a;
while(p1!=NULL)
p1=p1->next;
n++;
//n是计算链表的节点数,以备后面的排序用
q=NULL;
p1=head_a;
p2=p1->next
;
while(m
num>p2->num)
if(head==p1)
head=p2;
else
p3->next=p2;
p1->next=p2->next;p2->next=p1;
//以下是按照
p3
p1
p2排序
p3=p2;p2=p1->next;
else
p3=p1;p1=p1->next;p2=p2->next;
q=p1;p1=head;p2=p1->next;
return
(head);
如何对一组 IP 地址 进行排序?
咨询区
Cracker
我有一组如下IP地址。
192.168.1.5
69.52.220.44
10.152.16.23
192.168.3.10
192.168.1.4
192.168.2.1
我在寻找一个方法将他们排序成如下顺序。
10.152.16.23
69.52.220.44
192.168.1.4
192.168.1.5
192.168.2.1
回答区
Alex Aza
对 ip 地址进行排序,大概有三种方法。
使用
Version.Parse
这种方式最简单粗暴,也最有意思,参考代码如下:
static void Main(string[] args)
var unsortedIps = new[] "192.168.1.4",
"192.168.1.5",
"192.168.2.1",
"10.152.16.23",
"69.52.220.44"
;
var sortedIps = unsortedIps
.Select(Version.Parse)
.OrderBy(arg => arg)
.Select(arg => arg.ToString())
.ToList();
sortedIps.ForEach(k => Console.WriteLine(k));
输出结果:
将ip转int
字符串ip是无法进行有效排序的,但可以将其转为 int
处理,比如下面这样:
69.52.220.44 =>
69 * 255 * 255 * 255 +
52 * 255 * 255 +
220 * 255 +
44
3位填充法
先将IP地址切开,然后将不足三位的部分填充 0
,这样就方便直接对 string 进行排序,最后再拼接起来,参考如下代码:
public static class StringHelper
public static string IpAddressLabel(string ipAddress)
=> string.Join(".", ipAddress.Split('.').Select(part => part.PadLeft(3, '0')));
接下来简单测试下。
=> new[] "192.168.1.100", "192.168.1.1", "192.168.1.19"
.OrderBy(ip => StringHelper.IpAddressLabel(ip));
点评区
这三种对 IP 排序的方法有点意思,学习了。
以上是关于C语言链表中如何实现对一组数据进行排序?的主要内容,如果未能解决你的问题,请参考以下文章