Проблема с сортировкой строк в списке с++

Есть список со строками *char. Сортируется по данному алгоритму:

char* list_char_arr[] = {"bb", "ccc", "zzzz", "aaaaa"} ; 
struct list_char //двусвязный список символьный
{
    list_char(int v = 0):val_char(v),prev_char(0),next_char(0){};
    char val_char;
    list_char* prev_char;
    list_char* next_char;
};

list_char* input_list_char(list_char* ls_char) //создание списка символьного
{
    int size = 4;
    for (int i = 0; i < size; i++)
    {
         ls_char->val_char = **(list_char_arr + i);
        if (i == size - 1)
        {
            break;
        }
        ls_char->next_char = new list_char;
        ls_char->next_char->prev_char = ls_char;
        ls_char = ls_char->next_char;
    }
    while (ls_char->prev_char != NULL)
    {
        ls_char = ls_char->prev_char;
    }
    return ls_char;
}

void* first_list_char(void* in_char) //первый элемент списка символьного
{
    return (list_char*)in_char;
}

void* last_list_char(void* in_char) //последний элемент списка символьного
{
    list_char* temp = (list_char*)in_char;
    while (true)
    {
        if (((list_char*)in_char)->next_char == NULL) break;
        in_char = ((list_char*)in_char)->next_char;
    }
    temp = (list_char*)in_char;
    while (((list_char*)in_char)->prev_char != NULL)
    {
        in_char = ((list_char*)in_char)->prev_char;
    }
    return temp;
}

void* sec_list_char(void* in_char) //следующий элемент списка символьного
{
    return ((list_char*)in_char)->next_char;
}

void* list_perv_char(void* in_char) //Возвращаем предыдущий элемент символьного списка
{
    return ((list_char*)in_char)->prev_char;
}

int list_cmp_char(void* first_char, void* second_char)//сравнение символьного списка
{
    return ((list_char*)first_char)->val_char - ((list_char*)second_char)->val_char > 0 ? 1 : -1;
}

void sort(void* struc, void* begin(void*), void* end(void*), void* next(void*), int cmp(void*, void*), void swap(void*, void*), void* perve(void*), int k, int s) //сортировка
{
    if (k==1){
    void* i = begin(struc);
    void* last = end(struc);
    i = next(i);
    for (; ; i = next(i)) {
        for (void* j = i; cmp(j, perve(j)) < 0; j = perve(j))
        {
            swap(j, perve(j));
            if (j == next(begin(struc))) break;
        }
        if (i == last) break;
        }
    }
    else{
        qsort(struc, s, sizeof(char**), comp1);
    }
}

void list_swap_char(void* first_char, void* second_char) //меняем местами символьный список
{
    char temp = ((list_char*)first_char)->val_char;
    ((list_char*)first_char)->val_char = ((list_char*)second_char)->val_char;
    ((list_char*)second_char)->val_char = temp;
}

void print_list_char(list_char* ls_char) //печать отсортированного списка с символами
{
    cout << "Ваш список:\n";
    while (true)
    {
        cout << ls_char->val_char << ' ';
        if (ls_char->next_char == NULL) break;
        ls_char = ls_char->next_char;
    }
    cout << endl;
}

Результат такой: Ваш список: a b c z. Выводит только первые символы строк. Как сделать так, чтобы строки выводились полностью?


Ответы (1 шт):

Автор решения: Harry

У вас код куда больше напоминает С, чем С++. Работать нужно с const char *, раз уж бы берете строки из готового массива литералов:

const char * val_char;

Соответственно нужно изменить программу. Типа (даю старую и новую строки)

char* list_char_arr[] = {"bb", "ccc", "zzzz", "aaaaa"} ; 
const char* list_char_arr[] = {"bb", "ccc", "zzzz", "aaaaa"} ;

list_char(int v = 0):val_char(v),prev_char(0),next_char(0){};
list_char():val_char(0),prev_char(0),next_char(0){};

char val_char;
const char * val_char;

ls_char->val_char = **(list_char_arr + i);
ls_char->val_char = *(list_char_arr + i);

char temp = ((list_char*)first_char)->val_char;
const char * temp = ((list_char*)first_char)->val_char;

Ну и переписать comp1 в qsort. Может, еще что по мелочи найдется...

Но если вы начинаете использовать такие C++-ные вещи, как next или swap - почему не воспользоваться нормальной C++'ной sort?.. Без всех этих извращений? А для списка - list? или это задание такое?

→ Ссылка