需要帮助在C中创建并行数组

时间:2014-07-18 01:24:31

标签: c arrays string

只是一个免责声明:在C编程方面,我是一个完整的菜鸟,这可能很容易让人感到尴尬,但我自己也没想到,也没有找到任何有用的东西。无论如何,下面这个程序应该把名字(最后,第一)和年龄放入数组,然后按字母顺序排列。我遇到的问题是创建一种并行数组,以便按字母顺序排序后将年龄与各自的名称相匹配。有没有人有什么建议?我想某种方式将年龄数组绑定到我定义的函数中,但我仍然无法绕过它。提前谢谢!

#include <stdio.h>
#include <string.h>
#define NAME_LENGTH 50
#define MAX_NAMES 50

int alpha_first(char *list[], int min_sub, int max_sub);
void select_sort_str(char *list[], int n);

int
main(void)
{
    int i = 0;
    int numpeople;
    char names[MAX_NAMES][NAME_LENGTH] = { 0 };
    char ages[MAX_NAMES][NAME_LENGTH] = { 0 };
    char skip_line;
    char *alpha[MAX_NAMES] = { 0 };

    printf("Enter number of people <0..50>\n> ");
    scanf("%d", &numpeople);

    do
    {
        scanf("%c", &skip_line);
    }
    while (skip_line != '\n');


    for(i = 0; i < numpeople; ++i)
    {
        printf("Enter name %d (lastname, firstname) ", i+1);
        gets(names[i]);

        printf("Enter age %d: ", i+1);
        gets(ages[i]);

    }

    for(i = 0; i < numpeople; ++i)
    {
        alpha[i] = names[i];
        select_sort_str(alpha, numpeople);
    }

    printf("\n\n%-30s\n\n", "Original List");
    for  (i = 0;  i < numpeople;  ++i)
        printf("%-30s\n", names[i]);
    printf("\n\n%-30s\n\n", "Alphabetical Order");
    for  (i = 0;  i < numpeople;  ++i)
        printf("%-30s\n", alpha[i]);

    return 0;

}

int
alpha_first(char *list[],
            int min_sub, int max_sub)
{
    int first, i;

    first = min_sub;
    for (i = min_sub + 1; i <= max_sub; ++i)
            if (strcmp(list[i], list[first]) < 0)
                first = i;
    return (first);
}


void
select_sort_str(char *list[], int n)
{
    int fill, index_of_min;
    char *temp;

    for (fill=0; fill<n-1; ++fill)
    {
        index_of_min = alpha_first(list, fill, n - 1);

        if (index_of_min != fill)
        {
            temp = list[index_of_min];
            list[index_of_min] = list[fill];
            list[fill] = temp;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

使用结构:

typedef struct
{
    char *first_name;
    char *last_name;
    int age;
} person;

创建数组时,创建一个person的数组;创建一个新的person,填写其字段,将其添加到您的数组中。现在,您可以在一个漂亮的小包装中获得所需的所有数据。

答案 1 :(得分:0)

计算机科学中的大多数问题都是通过引入额外的间接层来解决的。

在这种情况下,请注意select_sort_str()正在排序指向字符串的指针数组。假设您构造一个索引值数组,初始化为0 .. numpeople-1,然后将这些索引排序为相应名称的顺序。因此,在alpha_first()中,以及char* list[],我们也需要int index[],然后进行比较:

if (strcmp(list[index[i]], list[index[first]]) < 0)

,类似select_sort_str(),您不会在list[]中交换index[]中的条目。然后以alpha顺序读取条目,使用额外的间接级别:

names[index[i]]