Problem z sortowaniem alfabetycznym w C

0

Witam miałem za zadanie przerobić program sortujący cyfry bubble sortem i insert sortem, na program sortujący wyrazy alfabetycznie coś nie pyka prosiłbym o pomoc, póki co programuje dosyć krótko.
Treść zadania
Zmodyfikować program, tak aby umożliwiał sortowanie alfabetyczne listy wyrazów w zadanej kolejności. Wskazówki:
listę wyrazów zdefiniować w kodzie programu jako tablicę char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"};
do porównywania dwóch wyrazów użyć funkcji strcmp, której prototyp jest w pliku nagłówkowym string.h
porządek sortowania jest wybierany dodatkowym argumentem int porzadek przekazywanym do funkcji babelki i wstawianie: jeżeli porzadek>=0 to sortowanie jest w porządku rosnącym, w przeciwnym przypadku w porządku malejącym
zmodyfikować odpowiednio funkcje kopiuj i wypisz, aby przyjmowały jako pierwszy argument tablicę ciągów znakowych

Kod który udało mi się napisać

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int ROZMIAR=4;
const char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"};

// funkcja porownujace dwa elementy typu string
int porownaj(char a[], char b[])
{
return strcmp(a, b);
}

// sortowanie babelkowe (ang. bubble sort)
void babelki(char* tablica[], int N)
{
int zamienione, i;
char* tmp;

do
{
    zamienione=0; // jezeli nie bedzie zadnej zamiany, to tablica jest juz uporzadkowana

    for(i=0;i<N-1;i++)
        if(porownaj(tablica[i], tablica[i+1]))
        {

            // zamiana dwoch sasiednich elementow
            tmp=tablica[i];
            tablica[i]=tablica[i+1];
            tablica[i+1]=tmp;

            // tablica jeszcze nie jest uporzadkowana
            zamienione=1;
        }
}
while(zamienione);

}

// sortowanie przez wstawianie (ang. insertion sort)
void wstawianie(char* tablica[], int N)
{
int i, j;
char* tmp;
for(i=1; i<N; i++)
{
// elementy o indeksach 0 do i-1 sa juz uporzadkowane

    tmp=tablica[i]; // wartosc i-tego elementu

    // przesuwanie elementow tablica[j]<=tmp
    j=i-1;
    while(j>=0 && porownaj(tablica[j],tmp))
    {
        tablica[j+1]=tablica[j];
        j--;
	}
    // wstawienie elementu (potrzebne jest dodanie 1 bo j bylo dekrementowane w linii 48)
    tablica[j+1]=tmp;
}

}

// funkcja wypisujac N elementow z tablicy int
void wypisz(char* tablica[], int N)
{
int i=0;
for(i=0;i<N;i++)
printf("%s\n", *(tablica+i));
}

// funkcja kopiujace N elementw typu int
void kopiuj(char* skad[], char* dokad[] ,int N)
{

int i;
for(i=0;i<N; i++)
    //*(dokad++)=*(skad++);
    strcpy(*dokad, *skad);

}

int main()
{
char* tablica[ROZMIAR];

printf("Przed sortowaniem: \n");
wypisz(nieposortowane, ROZMIAR);


kopiuj(nieposortowane, tablica, ROZMIAR);
babelki(tablica, ROZMIAR);

printf("Po sortowaniu babelkowym: \n");
wypisz(tablica, ROZMIAR);

kopiuj(nieposortowane, tablica, ROZMIAR);
wstawianie(tablica, ROZMIAR);

printf("Po sortowaniu przez wstawianie: \n");
wypisz(tablica, ROZMIAR);

return 0;

}

Z góry dziękuje z pomoc

1
  1. Popraw formatowanie;
  2. Masz mnóstwo problemów z porównywaniem char z char* albo const char* z char* albo char z const char** albo const char* z char* albo char* z const char* itp itd...;
  3. Zobacz jak działa funkcja strcmp: https://pl.wikibooks.org/wiki/C/strcmp - niczego nie posortuje tylko sprawdzi czy elementy nie są takie same, tj możesz ją wykorzystać do tego żeby sprawdzić czy jest sens porównywać elementy czy przeskoczyć do dwóch następnych;
  4. Twoja pętla w funkcji babelki nigdy się nie skończy, warunek w if zawsze będzie prawdziwy ponieważ wszystkie elementy w tablicy masz różne w konsekwencji funkcja strcmp zawsze zwróci 1 i zmienna zmienione zawsze wyniesie 1;
  5. Przykład kodu skompilowanego za pomocą gcc:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int ROZMIAR=4;
char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"};

// funkcja porownujace dwa elementy typu string
int rozne(char *a, char *b)
{
    return strcmp(a, b);
}

// sortowanie przez wstawianie (ang. insertion sort)
void wstawianie(char* tablica[], int N, int porzadek)
{
    int i, j;
    char* tmp;

    for(i = 0; i < N-1; i++)
    {
        for (j = i+1; j < N; j++)
        {
            if(rozne(tablica[i], tablica[j]))
            {
                if (!porzadek)
                {
                    if (tablica[i][0] > tablica[j][0])
                   {
                       tmp = tablica[i];
                       tablica[i] = tablica[j];
                       tablica[j] = tmp;
                   }
                }
                else
                {
                    if (tablica[i][0] < tablica[j][0])
                    {
                        tmp = tablica[i];
                        tablica[i] = tablica[j];
                        tablica[j] = tmp;
                    }
                }
            }
        }
    }
}

// funkcja wypisujac N elementow z tablicy int
void wypisz(char* tablica[], int N)
{
    int i = 0;
    for(i = 0; i < N; i++)
    printf("%s\n", (tablica[i]));
}

// funkcja kopiujace N elementw typu int
void kopiuj(char* skad[], char* dokad[] ,int N)
{
    int i;
    for(i = 0; i < N; i++)
        *(dokad++)=*(skad++);
}

int main()
{
    char* tablica[ROZMIAR];

    printf("Przed sortowaniem: \n");
    wypisz(nieposortowane, ROZMIAR);

    kopiuj(nieposortowane, tablica, ROZMIAR);
    wstawianie(tablica, ROZMIAR, 1);

    printf("Po sortowaniu: \n");
    wypisz(tablica, ROZMIAR);

    return 0;
}
0

Wielkie dzięki !! Wskaźników do końca jeszcze nie łapię, a strcmp przypadkiem nie sprawdzał jeszcze czy ciag wyrazowy jest mniejszy lub wiekszy dlatego nie zwracał 1 0 lub -1?

1 użytkowników online, w tym zalogowanych: 0, gości: 1