结构体数组(2021-07-16)

在这里插入图片描述

结构体数组

结构体数组属于结构体中的内容,将定义好的结构体存放在一个数组当中方便我们对多个结构相同的结构体进行操作。

定义结构体数组

结构体数组的定义方法与普通数组定义方法类似(前提是已经定义好结构体类型结构体类型参见上篇文章)都为数据类型(定义好的结构体类型)加数组名加[]加分号,代码如下所示

//结构体数组定义
#include<stdio.h>
#include<string.h>
struct arry//定义结构体类型
{
int id;
char name[128];
};
int main()
{
    struct arry student[5];//定义了一个含有5个struct arry类型的结构体数组
}

按照以上代码数组定义完成

结构体数组初始化

接下来进行数组的初始化,这里采用函数调用的方法进行结构体数组的初始化代码如下

//结构体数组初始化
#include<stdio.h>
#include<string.h>

struct arry//定义类型为struct arry类型的结构体
{
int id;
char name[128];
};
void set_student(struct arry *p,int n)//定义初始化函数用结构体类型指针接受数组首元素地址,用整形接受数组长度
{
    for(int i=0;i<n;i++)
    {
        (*(p+i)).id=i+1;//通过数组中结构体变量对结构体成员进行赋值==若使用地址应用指向操作==
        char buf[128];//定义字符数组用来存名字变量
        sprintf(buf,"%d%d%d",i,i,i);//组包函数将三个i组起来当作name
        strcpy((*(p+i)).name,buf);//拷贝字符到结构体的name成员中
    }
}
int main()
{
    struct arry student[5];//定义名为student的结构体数组
    set_student(student,sizeof(student)/sizeof(student[0]));//调用set_student函数对结构体数组进行初始化并传入数组首元素地址数组长度两个参数
    for(int i=0;i<sizeof(student)/sizeof(student[0]);i++)
    {
    printf("%d %s\n",student[i].id,student[i].name);//利用for循环将结构体每个成员都打印出来
    }    
}

通过以上操作就成功定义了结构体数组并对其进行了初始化和赋值操作,掌握结构体数组将大大提高我们对结构体数据的处理效率。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用冒泡排序或快速排序等算法对结构体数组进行排序,具体实现方法如下: 1. 冒泡排序 冒泡排序是一种简单的排序算法,它的基本思想是通过不断交换相邻的元素,将最大的元素逐步“冒泡”到数组的末尾。对于结构体数组,可以按照成绩高低的顺序进行排序,具体实现代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student { char name[20]; int score; } Student; void bubble_sort(Student arr[], int n) { int i, j; Student tmp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j].score < arr[j + 1].score) { tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { Student arr[5] = { {"Tom", 80}, {"Jerry", 90}, {"Alice", 70}, {"Bob", 85}, {"David", 75} }; int n = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, n); int i; for (i = 0; i < n; i++) { printf("%s %d\n", arr[i].name, arr[i].score); } return 0; } ``` 2. 快速排序 快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再按照同样的方法对这两部分数据分别进行快速排序,直到整个序列有序为止。对于结构体数组,可以按照成绩高低的顺序进行排序,具体实现代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student { char name[20]; int score; } Student; int partition(Student arr[], int left, int right) { int i = left, j = right; Student tmp = arr[left]; while (i < j) { while (i < j && arr[j].score <= tmp.score) { j--; } if (i < j) { arr[i++] = arr[j]; } while (i < j && arr[i].score >= tmp.score) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = tmp; return i; } void quick_sort(Student arr[], int left, int right) { if (left < right) { int pivot = partition(arr, left, right); quick_sort(arr, left, pivot - 1); quick_sort(arr, pivot + 1, right); } } int main() { Student arr[5] = { {"Tom", 80}, {"Jerry", 90}, {"Alice", 70}, {"Bob", 85}, {"David", 75} }; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n - 1); int i; for (i = 0; i < n; i++) { printf("%s %d\n", arr[i].name, arr[i].score); } return 0; } ``` ### 回答2: 结构体数组是将结构体类型的元素保存在数组中,方便对这些元素进行处理和操作。对于学生记录这样的结构体,我们可以根据不同的需求对其进行排序。本题需要将学生记录按照成绩高低进行排序,因此我们可以使用快速排序来解决问题。 快速排序的基本思想是选择一个基准数,将小于等于基准数的元素放到基准数左边,将大于基准数的元素放到基准数右边,然后分别对左右两边的元素进行递归排序。在本题中,我们可以将学生成绩作为基准数,将小于等于基准数的记录放到左边,将大于基准数的记录放到右边。 接下来是具体的实现步骤: 1. 定义一个学生记录的结构体,包括学生姓名和成绩两个字段。 2. 定义一个结构体数组,将多个学生记录保存到数组中。 3. 编写一个快速排序函数,实现根据成绩从大到小对学生记录进行排序。函数的参数包括一个结构体数组、左边界和右边界。 4. 在快速排序函数中实现分治算法,将小于等于基准数的记录放到左边,将大于基准数的记录放到右边,然后递归对左右两边的记录进行排序。 5. 在函数外部调用快速排序函数,对学生记录进行排序。 6. 输出排序后的学生记录。 下面是对应的代码实现: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义学生记录结构体 typedef struct student { char name[20]; int score; } Student; // 定义快速排序函数 void quickSort(Student *arr, int left, int right) { int i, j; Student pivot, temp; if (left < right) { // 初始化基准数和左右指针 pivot = arr[left]; i = left; j = right; while (i < j) { // 从后往前找到第一个比基准数小的记录 while (i < j && arr[j].score <= pivot.score) j--; if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } // 从前往后找到第一个比基准数大的记录 while (i < j && arr[i].score >= pivot.score) i++; if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 将基准数放到正确的位置 arr[left] = arr[i]; arr[i] = pivot; // 递归排序左右两边的记录 quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } } int main(void) { int n, i; Student *arr; printf("请输入学生人数:"); scanf("%d", &n); // 动态分配结构体数组内存空间 arr = (Student *)malloc(sizeof(Student) * n); if (arr == NULL) { printf("内存分配失败!\n"); return -1; } // 输入学生记录 printf("请依次输入学生姓名和成绩:\n"); for (i = 0; i < n; i++) { scanf("%s%d", arr[i].name, &arr[i].score); } // 对学生记录进行排序 quickSort(arr, 0, n - 1); // 输出排序后的学生记录 printf("\n按成绩从高到低排序后的学生记录如下:\n"); printf("姓名\t成绩\n"); for (i = 0; i < n; i++) { printf("%s\t%d\n", arr[i].name, arr[i].score); } // 释放内存空间 free(arr); return 0; } ``` ### 回答3: 要根据成绩高低将学生记录排序,我们可以使用结构体数组排序。结构体数组排序的一般思路是:先定义一个结构体数组,然后使用排序算法对其进行排序,最后输出排序后的结果。 具体实现过程分为以下几个步骤: 1. 定义结构体数组 结构体数组是由多个结构体元素组成的复合数据类型,每个元素包含多个字段。在本例中,结构体元素是学生记录,每个学生记录包含姓名和成绩两个字段,因此定义结构体如下: struct Student{ char name[20]; int score; }stu[5]; //定义了一个由5个学生记录组成的结构体数组 2.输入学生记录 在程序中输入5位学生的姓名和成绩。输入可以采用循环结构,逐个输入学生记录。 for(int i=0;i<5;i++){ printf("请输入第%d个学生的姓名和成绩:",i+1); scanf("%s%d",stu[i].name,&stu[i].score); } 3.排序算法 对学生记录进行排序,可以使用冒泡排序、快速排序、选择排序等多种排序算法。在本例中,我们使用冒泡排序对学生记录按照成绩从高到低排序,先对成绩进行比较,再交换对应的姓名。 void bubbleSort(struct Student *stu,int n){ for(int i=0;i<n-1;i++){ for(int j=0;j<n-i-1;j++){ if(stu[j].score<stu[j+1].score){ struct Student temp; temp=stu[j]; stu[j]=stu[j+1]; stu[j+1]=temp; } } } } 4.输出排序结果 最后,要输出按照成绩从高到低排序后的学生记录。可以使用循环结构遍历结构体数组。 for(int i=0;i<5;i++){ printf("第%d名学生:%s %d\n",i+1,stu[i].name,stu[i].score); } 这样,就可以实现根据成绩高低将学生记录排序的功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值