【好题分享】结构体排序&二维数组排序

题目:从键盘输入5个英文人名(例如Alice、Schwarzenegger等),按人名长短(字符个数)输出(按从短到长的顺序)。然后再将这5个人名按字符串大小从小到大排序后输出。

方法一:使用二维数组

思路:

  1. 题目要求存储5个名字,很容易想到用二维字符数组来存储
  2. 将二维数组看成一维数组,每个元素存放姓名
  3. 用strlen函数求姓名的长度
  4. 按照题目要求进行排序

1. 按照名字长度进行排序

代码实现

#include<stdio.h>
#include<string.h>
void sort_str_bylen(char name[][20], int n)
{
	int i, j;
	//使用冒泡排序法 从小到大排序
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{		
			if (strlen(name[j]) > strlen(name[j + 1]))//看成一维数组,数组有5个元素,每个元素长度是strlen(name[j]) 比较的就是每个元素的长度
			{	
			//如果前面元素长度大于后面元素 则交换前后两元素的内容
			//内容是字符串 不能用通常的“=”进行交换 需要用strcpy函数
				strcpy(str, name[j]);
				strcpy(name[j], name[j + 1]);
				strcpy(name[j + 1], str);
			}
		}
	}
}
	int main()
		{
		char name[5][20];
			char str[20];
			for (i = 0; i < 5; i++)
				gets(name[i]);  //输入
			sort_str_bylen(name,5);  //排序
			for (i = 0; i < 5; i++)
				puts(name[i]); //输出
			return 0;
		}

2. 按照名字大小排序

代码实现

#include<stdio.h>
#include<string.h>
void sort_str_bysz(char name[][20], int n)
{
	int i, j;
	//使用冒泡排序法 从小到大排序
	for (i = 0; i < n-1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{		
			if (strcmp(name[j], name[j + 1])>0)//看成一维数组,数组有5个元素,比较的是每个元素的长度
			{	
			//如果前面元素大小大于后面元素 则交换前后两元素的内容
			//内容是字符串 不能用通常的“=”进行交换 需要用strcpy函数
				strcpy(str, name[j]);
				strcpy(name[j], name[j + 1]);
				strcpy(name[j + 1], str);
			}
		}
	}
}
	int main()
		{
		char name[5][20];
			char str[20];
			for (i = 0; i < 5; i++)
				gets(name[i]);  //输入
			sort_str_bysz(name,5);  //排序
			for (i = 0; i < 5; i++)
				puts(name[i]); //输出
			return 0;

总结:

将字符串进行排序时,有两种排序方式,一种是按长度排序,另一种是按大小排序,核心思路都是将二维数组一维化,使用一维数组的排序方法,不同的是以什么方式比较两者大小?按长度排序需要用strlen函数,按大小排序需要用strcmp函数,这也是qsort函数需要注意的,另外字符串交换需要用strcpy函数

方法二:使用结构体

思路:

  1. 定义一个结构体数组,结构体成员是char name[]和int len
    在这里插入图片描述
  • 先将结构体数组每个元素的len成员排序(拿冒泡排序说明)
    在这里插入图片描述

  • 将len对应的name成员进行匹配

在这里插入图片描述
3. 重复步骤2 N-1次(N个元素)
4. 从结构体一号开始输出直到结构体五号

按照名字长度进行排序

代码实现

#include<string.h>
#include<stdio.h>
typedef struct NAME //实现思路一
{
	char name[20];
	int len;
}N;
void sort_struct_bylen(N* ps, int n)
{
	int i, j;
	int temp;
	char str[20];
	for (i = 0; i < n - 1; i++) //重复n-1次
	{
		for (j = 0; j < n - 1 - i; j++)
		{	//比较len的大小
			if ((ps + j)->len < (ps + j + 1)->len)//冒泡排序法 比较组字符串的长度
			{
				//实现思路2 实现len从小到大排序
				temp = (ps + j)->len;
				(ps + j)->len = (ps + j + 1)->len;
				(ps + j + 1)->len = temp;
				//实现思路2 将name与len匹配
				strcpy(str, (ps + j)->name);
				strcpy((ps + j)->name, (ps + j + 1)->name);
				strcpy((ps + j + 1)->name, str);
			}
		}
	}
}
	int main()
	{
		N Name[5];
		int i = 0;
		for (i = 0; i < 5; i++)
		{
			gets(Name[i].name);
			Name[i].len = strlen(Name[i].name);
		}
		sort_struct_bylen(Name, 5);
		for (i = 0; i < 5; i++)
		puts(Name[i].name); //思路4
		return 0;
	}

按照名字大小排序

#include<string.h>
#include<stdio.h>
typedef struct NAME //实现思路一
{
	char name[20];
	int len;
}N;
void sort_struct_bysz(N* ps, int n)
{
	int i, j;
	char str[20];
	for (i = 0; i < n - 1; i++) //重复n-1次
	{
		for (j = 0; j < n - 1 - i; j++)
		{	//比较len的大小
			if (strcmp((ps + j)->name, (ps + j + 1)->name) > 0)//冒泡排序法 比较组字符串的大小			
			{  //思路2 此时无需len,直接由字符串大小的比较结果来确定name成员改不改变位置
				strcpy(str, (ps + j)->name);
				strcpy((ps + j)->name, (ps + j + 1)->name);
				strcpy((ps + j + 1)->name, str);
			}
		}
	}
}

int main()
{
	N Name[5];
	int i = 0;
	for (i = 0; i < 5; i++)
		gets(Name[i].name);	
	sort_struct_bysz(Name, 5);
	for (i = 0; i < 5; i++)
		puts(Name[i].name);//思路4
}

总结

使用结构体进行排序时若按名字长度排序,则先要将长度成员排序
len成员每进行一次排序,name成员就要和len匹配
若按名字大小排序时 直接用strcmp函数比叫name成员 大的往后放就行 此时与len成员无关

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值