Проблема с сортировкой строк в списке с++
Есть список со строками *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? или это задание такое?