首页 > 解决方案 > 使用指针函数对结构的成员进行排序

问题描述

我正在尝试通过调用交换函数来完成大部分工作。程序的重点是在main函数中初始化week数组,然后使用swap函数对数组的结构成员'temp'进行从小到大的排序。最终结果应该从最小到最大对 temp 的数组值进行排序(并将日期名称与相应的 temp 保持一致)。

我已经尝试了各种语法(不正确)并且不确定我做错了什么。我正在尝试学习将结构成员作为指针访问并使用外部函数操作它们的正确方法。

struct weather {
    char day[10];
    float temp;
};

void swap (struct weather *p);



int main()
{
    struct weather week[7] = {
    { "Sunday", 72.5 },
    { "Monday", 68.4 },
    { "Tuesday", 75.0 },
    { "Wednesday", 73.8 },
    { "Thursday", 65.1 },
    { "Friday", 72.8 },
    {"Saturday", 75.2 }
};

swap(week);

int x;
puts("This week's forecast from coldest to warmest:");
for(x=0;x<7;x++)
    printf("%10s %.1f degrees\n",
            week[x].day,
            week[x].temp);

return(0);
}


void swap (struct weather *p){

int x;
int t;
for (x=0;x<7;x++){
    if (p[x+1].temp < p[x].temp){
        t = p[x+1].temp;
        p[x+1].temp = p[x].temp;
        p[x].temp = t;
        }
    }
}

我希望结构的第二个成员数组(temp)按升序排列。不是,星期六列出的温度为 0。我的问题的目的是确保我正确地操作内存中数组的值。

标签: c

解决方案


好吧,您对此有些倒退。swap是一种操作,您只需交换数组的两个元素,并且sort是一种单独的操作,您可以迭代数组中的元素,测试每个元素应按排序顺序放置,swap用于更改元素在数组中的位置大批。

您的数组是您的结构数组(例如week)。因此,当您对数组进行排序时,您将需要swap元素。要交换 type 的元素struct weather *,您只需要:

void swap (struct weather *a, struct weather *b)
{
    struct weather tmp = *a;
    *a = *b;
    *b = tmp;
}

排序操作是一个单独的操作(您应该编写一个简单的比较函数和排序调用qsort)。但是,出于教育目的和小型数组,您可以选择任何您想要的排序算法,例如简单的插入排序week以按temp成员(按升序)对数组进行排序,例如

void sorttemp (struct weather *p, int nmemb)
{
    for (int i = 0; i < nmemb; i++)
        for (int j = i; j > 0 && p[j].temp < p[j-1].temp; j--)
            swap (&p[j], &p[j-1]);
}

注意:上面,swap通过提供每个元素的地址swap (&p[j], &p[j-1]);(例如指针)来调用, )

总而言之,您可以这样做:

#include <stdio.h>

struct weather {
    char day[10];
    float temp;
};

void swap (struct weather *a, struct weather *b)
{
    struct weather tmp = *a;
    *a = *b;
    *b = tmp;
}

void sorttemp (struct weather *p, int nmemb)
{
    for (int i = 0; i < nmemb; i++)
        for (int j = i; j > 0 && p[j].temp < p[j-1].temp; j--)
            swap (&p[j], &p[j-1]);
}

int main (void)
{
    struct weather week[7]  =  {{ "Sunday", 72.5 },
                                { "Monday", 68.4 },
                                { "Tuesday", 75.0 },
                                { "Wednesday", 73.8 },
                                { "Thursday", 65.1 },
                                { "Friday", 72.8 },
                                { "Saturday", 75.2 }};

    sorttemp (week, 7);

    puts ("This week's forecast from coldest to warmest:");
    for (int x = 0; x < 7; x++)
        printf ("%10s %.1f degrees\n", week[x].day, week[x].temp);

}

示例使用/输出

$ ./bin/sort_week_temp
This week's forecast from coldest to warmest:
  Thursday 65.1 degrees
    Monday 68.4 degrees
    Sunday 72.5 degrees
    Friday 72.8 degrees
 Wednesday 73.8 degrees
   Tuesday 75.0 degrees
  Saturday 75.2 degrees

如果您还有其他问题,请查看并告诉我。


推荐阅读