数据结构实验解答 排序

设学生的数据信息存储在文件“
studata2.txt”中,且第一个数据为学生数。文件中数据的内容形式如下:1 张三 76 85

img

设n个学生数据信息(学号、姓名及多门课程的成绩等)已按存放在一个文件,以顺序表作为排序表,完成如下实验内容:
(1)直接插入排序:从文件中读取所有学生数据信息创建学生信息表,采用直接插入排序方法对该表按姓名以递增方式排序,并显示排序结果;
(2)希尔排序:从文件中读取所有学生数据信息创建学生信息表,采用希尔排序方法,将学生信息表按总成绩以递减方式排序,并显示排序结果;

打开文件后读取第一个数,获得人数,动态申请内存空间,然后逐行读取放入结构体数组
下面两个排序是比较典型的两种排序方式
运行结果:(我只在文件里写了5个数据)
先贴个拼音名字的,能看出来是按名字递增排序

img

下面是汉字名字的

img

代码:

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

typedef struct _student
{
    int id;
    char name[20];
    int kc1;
    int kc2;
    int zcj; //总成绩
}Student;


//插入排序
void InsertSort(Student *nums,int numsSize)
{
    int i,j;
    Student temp;
    for(i=1;i<numsSize;i++)
    {
        if(strcmp(nums[i].name,nums[i-1].name)<0)
        {
            temp=nums[i];
            for(j=i-1;j>=0;j--)
            {
                if(strcmp(nums[j].name,temp.name)>0)
                    nums[j+1]=nums[j];
                else 
                    break;
            }
            nums[j+1]=temp;
        }
    }
}
//希尔排序
void shellSort(Student *a, int len)
{
    int i, j, k,  gap;  // gap 为步长
    Student tmp;
    for (gap = len / 2; gap > 0; gap /= 2) {  // 步长初始化为数组长度的一半,每次遍历后步长减半,
        for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标 
            for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
                tmp = a[j];  // 备份a[j]的值
                k = j - gap;  // j初始化为i的前一个元素(与i相差gap长度)
                while (k >= 0 && a[k].zcj > tmp.zcj) {
                    a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
                    k -= gap;
                }
                a[k + gap] = tmp; 
            }
        }
    }
}

//显示数组
void showAll(Student* a,int n)
{
    int i;
    printf("--------------------------------------------------------------\n");
    printf("%6s %10s %6s %6s %6s\n","学号","姓名","课程1","课程2","总成绩");
    printf("--------------------------------------------------------------\n");
    for(i=0;i<n;i++)
        printf("%6d %10s %6d %6d %6d\n",a[i].id,a[i].name,a[i].kc1,a[i].kc2,a[i].zcj);
}

int main()
{
    int n=0,i=0;
    Student* arr = 0;
    FILE *fp =fopen("studata2.txt","r");
    if(fp == 0)
    {
        printf("文件打开失败\n");
        return 0;
    }
    fscanf(fp,"%d",&n); //得到学生总数
    arr = (Student*)malloc(sizeof(Student)*n);
    for(i=0;i<n && (!feof(fp));i++)
    {
        fscanf(fp,"%d %s %d %d %d",&arr[i].id,arr[i].name,&arr[i].kc1,&arr[i].kc2,&arr[i].zcj);
    }
    //插入排序
    printf("按姓名递增排序:\n");
    InsertSort(arr,n);
    showAll(arr,n);
    printf("按照总成绩递增排序:\n");
    shellSort(arr,n);
    showAll(arr,n);
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632