【问题标题】:How to sort structs from least to greatest in C?如何在C中将结构从最小到最大排序?
【发布时间】:2016-05-01 10:32:44
【问题描述】:
  1. 程序需要根据每个单独结构的 zip 元素从最小到最大对结构进行排序。
  2. 输入基于输入/输出重定向。 input.txt 文件的示例如下:
Jason Solis   
20294 Lorenzana Dr  
Woodland Hills, CA   
91364   
Robert Smith   
19831 Henshaw St   
Culver City, CA   
94023   
Bob Arum  
5142 Dumont Pl   
Azusa, CA   
91112 

代码:

struct info {

    char name[BUFF_SIZE];                                
    char stAddress[BUFF_SIZE];                                      
    char cityAndState[BUFF_SIZE]; 
    char zip[BUFF_SIZE];
};

 void selectionSort(struct info *ptrStruct);




int main(void)
{

    int count;                       
    char buffer[600];
    struct info *ptrStruct[512];

    for (count = 0; count < 18; count++)
    {
        ptrStruct[count] = (struct info*) malloc(sizeof(struct info));  
        gets(buffer);
        strcpy(ptrStruct[count]->name, buffer);         
        gets(buffer);   
        strcpy(ptrStruct[count]->stAddress, buffer);    
        gets(buffer);
        strcpy(ptrStruct[count]->cityAndState, buffer); 
        gets(buffer);
        strcpy(ptrStruct[count]->zip, buffer);          
    }

    selectionSort(ptrStruct);

    printf("\n\nLEAST TO GREATEST\n");
    for (count = 0; count < 18; count++)
    {
        printf("%s\n", ptrStruct[count]->name);
        printf("%s\n", ptrStruct[count]->stAddress);
        printf("%s\n", ptrStruct[count]->cityAndState);
        printf("%s\n", ptrStruct[count]->zip);
    }
}

void selectionSort(struct info *ptrStruct[])
{

    int count2;
    int count1;
    int minIndex;
    struct info *ptrTemporary;      

    for (count2 = 0; count2 < 18 - 1; count2++)
    {
        minIndex = count2;
        for (count1 = count2 + 1; count1 < 18; count1++)
        {
            if (strcmp(ptrStruct[count1]->zip, ptrStruct[minIndex]->zip) < 0)
                minIndex = count1;
        }
        ptrTemporary = ptrStruct[count2];
        ptrStruct[count2] = ptrStruct[minIndex];
        ptrStruct[minIndex] = ptrTemporary;
    }
}

【问题讨论】:

  • 什么是STRUCT_SIZE
  • 访问元素,然后对它们进行排序
  • STRUCT_SIZE 我刚改成 512。
  • @RodEfraim:胡,18 岁就可以了,不是吗?
  • 好的,最后:这是错误selectionSort(ptrStruct); 这个调用应该会让编译器痛苦地大喊。

标签: c sorting pointers data-structures struct


【解决方案1】:

这样修复

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

#define BUFF_SIZE 32
#define STRUCT_SIZE 512

struct info {
    char name[BUFF_SIZE];
    char stAddress[BUFF_SIZE];
    char cityAndState[BUFF_SIZE]; 
    char zip[BUFF_SIZE];
};

void selectionSort(struct info *ptrStruct[], int size);//!

int main(void){
    int count, size;//!
    char buffer[600];
    struct info *ptrStruct[STRUCT_SIZE];

    for (count = 0; count < STRUCT_SIZE; count++){
        ptrStruct[count] = (struct info*) malloc(sizeof(struct info));
        if(EOF==scanf("%599[^\n]%*c", buffer)){//!
            free(ptrStruct[count]);
            break;
        };
        strcpy(ptrStruct[count]->name, buffer);
        scanf("%599[^\n]%*c", buffer);
        strcpy(ptrStruct[count]->stAddress, buffer);
        scanf("%599[^\n]%*c", buffer);
        strcpy(ptrStruct[count]->cityAndState, buffer);
        scanf("%599[^\n]%*c", buffer);
        strcpy(ptrStruct[count]->zip, buffer);
    }

    size = count;//!
    selectionSort(ptrStruct, size);//!

    printf("\n\nLEAST TO GREATEST\n");
    for (count = 0; count < size; count++)//!
    {
        printf("%s\n", ptrStruct[count]->name);
        printf("%s\n", ptrStruct[count]->stAddress);
        printf("%s\n", ptrStruct[count]->cityAndState);
        printf("%s\n", ptrStruct[count]->zip);
        free(ptrStruct[count]);
    }
}

void selectionSort(struct info *ptrStruct[], int size)//!
{
    int count1, count2;
    int minIndex;
    struct info *ptrTemporary;

    for (count2 = 0; count2 < size -1; count2++)//!
    {
        minIndex = count2;
        for (count1 = count2 + 1; count1 < size; count1++)//!
        {
            if (strcmp(ptrStruct[count1]->zip, ptrStruct[minIndex]->zip) < 0)//!
                minIndex = count1;
        }
        if(minIndex != count2){
            ptrTemporary = ptrStruct[count2];//!
            ptrStruct[count2] = ptrStruct[minIndex];
            ptrStruct[minIndex] = ptrTemporary;//!
        }
    }
}

【讨论】:

  • 没关系,我看到我犯的一个大错误是我将指针传递给 selectionSort 函数而不是传递指针数组!现在我的程序没有崩溃。
  • 它不会让我接受,因为我现在是菜鸟。我没有足够的声望点来投票给你!再次感谢。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2012-04-16
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2021-03-15
相关资源
最近更新 更多