Пузырьковая сортировка двумерного символьного массива - C (СИ)
Формулировка задачи:
Передо мной была поставлена задача написать код, осуществляющий сортировку рандомно-сгенерированого символьного массива.
Сгенерировал нормально, а вот с сортировкой проблема.
Синтаксических ошибок не имеется, программа просто падает(Ну разумеется не просто а ввиду кривизны моих рук). Глубокими познаниями в C не располагаю, посему надеюсь, вы тыкнете меня носом, и обьясните что и как. Подозреваю, что накосячил с указателями, но вот где в толк не возьму, выглядит вроде все приемлемо...
В общем.. Вот код.
#include <stdio.h>
#include <time.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
bubblest(char **buff, int stc, int stsz) //Проблемная функция
{
int i, f; //Счетчик, флажок
char *buffer; //Буфер для перемены двух строк местами
buffer = (char*)malloc(stsz*sizeof(char*)); //Выделил память под буфер
do
{
f=1; //Флажок на ноль
for(i=0;i<stc;++i) //поочередно перебираем строки
{
if (strcmp(*buff[i], *buff[i+1])!=0) //Если они не равны(strcmp возвращает ноль при равенстве строк), то:
if (strcmp(*buff[i], *buff[i+1])<0) //Если i-я строка по алфавиту ниже (i+1)-й(strcmp возвращает -1) то
{
buffer=buff[i]; //В буфер помещаем i-ую строку <--------
buff[i]=buff[i+1]; //В i-ую строку помещаем (i+1)-ую строку |
buff[i+1]=buffer; //В (i+1)-ую помещаем то, что в буфере-------
f=0; //Флаажок на ноль, т.к. перестановка совершена.
}
}
}
while(f==0); //Условие цикла(Флаг на нуле => была совершена перестановка(ки))
}
/*void(char **buf, int stc) <<<<<<< Здесь буду реализовывать вывод отсортированного, но до него еще дожить надо
{
int i;
}*/
void testst(int stc, int stsz) //Ну собственно функция генерации массива, в ней все
//хорошо, т.к. Если закоментировать "проблемную" функцию сортировки, exeшник не падает
{
int i, a, j, numberst=0;
char *storage;
char **buf;
char alph[10]="asdfghjklp";
storage = (char*)malloc(stsz*stc); //выделяем память для массива
buf = (char**)malloc(stsz*sizeof(char*)); //массив указателей на строки матрицы
for (i=0;i<stc;++i)
{
{
for(j=0;j<stsz;++j)
{
a=rand()%9;
storage[j]=alph[a];
}
storage[j]='\0';
buf[i]= storage;
printf("%s",buf[i]);
}
numberst++;
}
printf("-------------------------------------");
bubblest(buf, stc, stsz);
}
int main()
{
srand(time(NULL));
testst(10,80);
getch();
return 0;
}Решение задачи: «Пузырьковая сортировка двумерного символьного массива»
textual
Листинг программы
char* t = storage[i]; storage[i] = storage[--i]; storage[i] = t;
Объяснение кода листинга программы
Пузырьковая сортировка двумерного символьного массива:
- Переменная
tинициализируется значениемstorage[i](в этом случаеtсодержит ссылку на элемент массиваstorageс индексомi). - Элемент
storage[i]заменяется на значениеstorage[--i], где--iуменьшает значение индексаiна единицу (поскольку индексы в C начинаются с 0, это означает, чтоstorage[--i]будет содержать элемент массиваstorageс индексомi-1). - Элемент
storage[i]заменяется на значение переменнойt(т.е. на значение, которое было изначально присвоено переменнойt). Эти шаги повторяются для всех элементов массиваstorage. В результате, элементы массива сортируются в порядке возрастания.