Прежде всего, не забудьте инициализировать переменные, такие как deleted
, как было сказано в других ответах.
Далее вы должны освободить память (так как вы удаляете элементы) иВы только звоните malloc(3)
).Это кажется немного противоречащим здравому смыслу, не так ли?
В-третьих, вы делаете много строкового копирования в циклах, в то время как это должно быть более эффективным, просто перемещая указатели вверх, так что вы не делаетенужно перераспределить строковые элементы и скопировать содержимое ячейки (кстати, вы уверены, что эти строки будут переданы в функцию как malloc()
d строк? Я предполагаю, что, как и вы)
В-четвертых,рассмотрим сначала сортировку массива, чтобы все похожие строки были соседними в массиве.Это имеет стоимость O(n*log(n))
, которая при добавлении к следующей строке удаления, если она равна (при стоимости O(n)
), составляет общую стоимость O(n*(log(n)+1))
или O(n*log(n))
, а не O(n^2)
, которая является вашей фактической стоимостью)
После сортировки, только удаленные строки должны быть free(3)
d, указатели перемещаются обратно в начало массива, когда появляются дыры, и, наконец, (когда все закончено), вы можете просто realloc(3)
массив указателей (толькоодин раз, не при каждом прохождении цикла)
Пересмотр примера выходит за рамки этого ответа, так как на самом деле это выглядит как школьное упражнение.Простите за это.Я уверен, что другие подсказки помогут вам повторить упражнение с большим успехом.
И подумайте: думать перед тем, как писать, - это то, как человек преуспевает в этой работе.