冒泡排序,动态结构体数组举例

冒泡排序


#include <stdio.h>
// 交换数组中指定两个位置的元素
void swap(int * pArr, int pos1, int pos2) {
	int temp = pArr[pos1];
	pArr[pos1] = pArr[pos2];
	pArr[pos2] = temp;
}

// 冒泡排序
void sort(int * pArr, int len) {
	int i, j;
	for (i = 0; i < len - 1; i++) {
		for (j = 0; j < len - 1 - i; j++) {
			if (pArr[j] > pArr[j + 1]) {
				swap(pArr, j, j + 1);
			}
		}
	}
}
// 打印
void printArr(int * pArr, int len) {
	int i = 0;
	for (; i < len; i++) {
		printf("%d, ", pArr[i]);
	}
	printf("\n");
}

int main(void) {

	int a[6] = { 8, 3, 6, 2, 5, 0 };

	printArr(a, 6);

	sort(a, 6);

	printArr(a, 6);


	return 0;
}


动态结构体数组举例

#include <stdio.h>
#include <malloc.h>
#include <string.h>
/*
1, 需求
	学生信息管理系统, 存放所有学生信息, 按分数排序输出
2, 设计
	1) 用数组 存放 所有学生
	2) 用结构体 描述 每个学生
	3) 使用 冒泡排序 对学生进行排序
 */
// 定义结构体
struct Student {
	char name[100];	// 姓名
	float score;	// 分数
};
// 添加学生
void addStu(struct Student * pStuArr, char name[100], float score, int index) {
	strcpy( pStuArr[index].name, name);
	pStuArr[index].score = score;
}
// 排序, 按分数降序
void sort(struct Student * pStuArr, int len) {
	int i, j;
	struct Student temp;
	for (i = 0; i < len - 1; i++) {
		for (j = 0; j < len - 1 - i; j++) {
			if (pStuArr[j].score < pStuArr[j+1].score) {
				temp = pStuArr[j];	// 换学生在数组中的位置, 而不是学生的成绩
				pStuArr[j] = pStuArr[j+1];
				pStuArr[j+1] = temp;
			}
		}
	}
}
// 打印所有学生
void printStus(struct Student * pStuArr, int len) {
	int i;
	for (i = 0; i < len; i++) {
		printf("%s, %f \n", pStuArr[i].name, pStuArr[i].score);
	}
}

int main(void) {

	int len = 5;
	struct Student * stuArr;
	// 动态构建数组
	stuArr = (struct Student *) malloc( sizeof(struct Student) * len );

	int index = 0;

	// 录入学生信息
	// scanf("%f", &stuArr[i].score) 给 学生的 score 赋值
	// scanf("%s", stuArr[i].name) 给学生 name 赋值, name本身就是 char数组的首地址,无需用"&"
	addStu(stuArr, "小红-66", 66.6f, index++);
	addStu(stuArr, "大红-55", 55.5f, index++);
	addStu(stuArr, "大黄-88", 88.8f, index++);
	addStu(stuArr, "小黄-77", 77.7f, index++);
	addStu(stuArr, "晓晓-44", 44.4f, index++);

	// 给学生排序, 按分数 降序
	sort(stuArr, len);

	// 打印
	printStus(stuArr, len);

	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值