Как преобразовать пузырьковую сортировку с использованием массива в двусвязный список?

Как я могу преобразовать приведенные ниже массивы в двусвязный список со структурой и указателями и при этом эта программа будет работать? Я предполагаю, что это возможно правильно? Программа, которую мне нужно создать, должна хранить имя и возраст в узлах двусвязного списка.

#include <stdio.h>
#include <string.h>
#include <stdio.h>
#define SIZE 10


void input (char fullname[][25], int age[]);
void output (char fullname[][25], int age[]);
void bubblesortname (char fullname[][25], int *age, int size);
void bubblesortage (char fullname[][25], int *age, int size);
void fflush_stdin();

//Input function handles prompt and user input.
void input (char fullname[][25], int age[])
{
    int i = 0;
    size_t nchr = 0;
    for (i = 0; i < SIZE; i++) {
        printf ("\nEnter a full name: ");
        if (fgets (fullname[i], 24, stdin) != NULL)
        {
            nchr = strlen (fullname[i]);
            while (nchr > 0 && (fullname[i][nchr -1] == '\n' || fullname[i][nchr -1] == '\r'))
                fullname[i][--nchr] = 0;
        }
        printf ("Enter the age    : ");
        scanf ("%d", &age[i]);
        fflush_stdin();
    }
}

//output function prints out name and age array
void output (char fullname[][25], int age[])
{
    int i;
    for (i = 0; i < SIZE; i++)
        printf (" %-30s, %d\n", fullname[i], age[i]);
}            



int main (void)
{
    //array for user entered names
    char fullname[SIZE][25];
    //array for user enter ages
    int age[SIZE];

    // promt user for names and ages
    input (fullname, age);

    //output unsorted names and ages

    output (fullname, age);

    // sorts by name
    bubblesortname (fullname, age, SIZE);

   // output sorted names
    output (fullname, age);

    //sorts age
    bubblesortage (fullname, age, SIZE);

    //output sorted ages with corresponding names
    output (fullname, age);


    return 0;
}



// sorts the fullname array with bubblesort
void bubblesortname (char fullname[][25], int *age, int size)
{
    int j = 0, i = 0;
    int temp_age = 0;
    char temp_name[25] = {0};

    for (i = 0; i < size - 1; ++i) {

        for (j = 0; j < size - 1 - i; ++j) {
            if (strcmp (fullname[j], fullname[j + 1]) > 0) {
                temp_age = age[j + 1];
                age[j + 1] = age[j];
                age[j] = temp_age;

                strcpy (temp_name, fullname[j + 1]);
                strcpy (fullname[j + 1], fullname[j]);
                strcpy (fullname[j], temp_name);
            }           
        }           
    }               
}               

//sorts age array
void bubblesortage (char fullname[][25], int *age, int size)
{
    int j = 0, i = 0;
    int temp_age = 0;
    char temp_name[25] = {0};

    for (i = 0; i < size - 1; ++i) {

        for (j = 0; j < size - 1 - i; ++j) {
            if (age[j] > age[j + 1]) {
                temp_age = age[j + 1];
                age[j + 1] = age[j];
                age[j] = temp_age;

                strcpy (temp_name, fullname[j + 1]);
                strcpy (fullname[j + 1], fullname[j]);
                strcpy (fullname[j], temp_name);
            }           
        }           
    }               
}

void fflush_stdin()
{ int c; while ((c = getchar()) != '\n' && c != EOF); }

person user311607    schedule 30.04.2015    source источник
comment
Это не простой вопрос, на который можно ответить, не написав за вас весь код. У вас есть более конкретный вопрос? Что вы не понимаете в двусвязных списках?   -  person kaylum    schedule 30.04.2015
comment
Мне действительно только начало нравится, как превратить два массива в узлы? Возможно, я не смогу правильно сформулировать это... char fullname[][25], int age[] Как можно удалить эти два массива, чтобы позволить пользователю сохранять имя и возраст в двусвязном списке?   -  person user311607    schedule 30.04.2015
comment
Вы знаете, как использовать struct? Это то, что вы использовали бы для определения узла списка.   -  person kaylum    schedule 30.04.2015


Ответы (1)


Непонятно, какой у вас уровень C. Некоторые из приведенных ниже являются довольно простыми, и не все вопросы охвачены. Пожалуйста, спрашивайте дополнительно, если требуется.

Большинство структур данных используют указатель и конструкцию C struct. Например, узел двусвязного списка в вашем случае будет выглядеть примерно так:

struct person_node {
    struct person_node *next;
    struct person_node *prev;
    char name[25];
    int age;
};

/* This holds the start of the list */
struct person_node *list_head = NULL;

Тогда у вас будут функции для добавления в список, удаления из списка, поиска в списке и т. д. Некоторые из этих функций (по крайней мере, добавить и удалить) будут иметь дело с динамическим выделением и освобождением узлов как часть их работы.

person kaylum    schedule 30.04.2015
comment
Спасибо. Я собираюсь возиться с этим немного. Мне не нужно удалять из списка, просто добавляйте имена и возраст от пользователя. Используя структуру, можно ли сохранить имя с соответствующим возрастом? - person user311607; 30.04.2015
comment
Да, это то, что показывает пример. Структура содержит как имя, так и возраст. - person kaylum; 30.04.2015