Hej, napisałam program sortowanie przez scalanie, ale coś mi poszło nie tak i nie wiem co powinnam zmienić, pomożecie? :)
Załączam kod :) Z góry dziękuję za pomoc.
Ps. Jestem blondynką :D
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void sortowanie_przez_scalanie(char, int, int);
void scal(char, int, int, int);
#define MAXWORD 65536
char* tab[MAXWORD];
int* pom; // tablica pomocnicza, potrzebna przy scalaniu
int main()
{
char srcfname[512], dstfname[512];
FILE *srcf = NULL, *dstf = NULL;
int result = 0, i = 0, n = 0, len = 0;
#define MAXCHAR 1024
char buf[MAXCHAR];
printf("\nSortowanie wyrazow.");
printf("\nPodaj nazwe pliku zrodlowego: ");
scanf("%511s", srcfname);
/* otworz plik zrodlowy */
srcf = fopen(srcfname, "rt");
if (srcf == NULL)
{
printf("\nNie moge otworzyc pliku: %s", srcfname);
goto exit;
}
printf("\nPodaj nazwe pliku docelowego: ");
scanf("%511s", dstfname);
/* otworz plik docelowy */
dstf = fopen(dstfname, "wt");
if (dstf == NULL)
{
printf("\nNie moge utworzyc pliku: %s", dstfname);
goto exit;
}
printf("\nCzytam dane z pliku: %s", srcfname);
for (n = 0; n < MAXWORD; n++)
{
result = fscanf(srcf, "%1023s", buf);
if (result == 0)
{
printf("\nNieoczekiwany blad przy czytaniu z pliku: %s", dstfname);
goto exit;
}
if (result == EOF)
break;
len = strlen(buf);
tab[n] = (char*)malloc(len + 1);
if (tab[n] == 0)
{
printf("\nBrak pamieci");
goto exit;
}
strcpy(tab[n], buf);
}
/* algorytm sortujacy - sortowanie przez selekcjê
na pierwsze miejsce wstaw najmniejszy z pozostalych (zamien miejscami)
zrob to samo z reszta listy bez wybranych ju¿ elementow */
printf("\nSortuje wyrazy");
sortowanie_przez_scalanie(tab, 0, n - 1);
/* zapisz wynik w pliku docelowym */
for (i = 0; i < n; i++)
{
result = fprintf(dstf, "%s\n", tab[i]);
if (result < 0)
{
printf("\nBlad przy zapisie do pliku : %s", dstfname);
goto exit;
}
}
/* powiadom uzytkownika, ¿e skonczyles */
printf("\nWynik porzadkowania wyrazow zapisano w pliku: %s\n", dstfname);
exit: /* zwolnij pamiec, do ktorej wczytywales wyrazy; zamknij pliki */
for (i = 0; i < n; i++)
free(tab[i]);
if (srcf)
{
fclose(srcf);
srcf = 0;
}
if (dstf)
{
fclose(dstf);
dstf = 0;
}
return 0;
}
void scal(char tab[], int lewy, int srodek, int prawy)
{
int i = lewy, j = srodek + 1; // kopiujemy lewą i prawą część tablicy do tablicy pomocniczej
for (int i = lewy; i <= prawy; i++)
pom[i]
= tab[i]; // scalenie dwóch podtablic pomocniczych i zapisanie ich we własciwej tablicy
for (int k = lewy; k <= prawy; k++)
if (i <= srodek)
if (j <= prawy)
if (pom[j] < pom[i])
tab[k] = pom[j++];
else
tab[k] = pom[i++];
else
tab[k] = pom[i++];
else
tab[k] = pom[j++];
}
void sortowanie_przez_scalanie(char tab[], int lewy, int prawy)
{
// gdy mamy jeden element, to jest on już posortowany
if (prawy <= lewy)
return; // znajdujemy srodek podtablicy
int srodek = (prawy + lewy) / 2; // dzielimy tablice na częsć lewą i prawa
sortowanie_przez_scalanie(tab, lewy, srodek);
sortowanie_przez_scalanie(tab, srodek + 1, prawy); // scalamy dwie już posortowane tablice
scal(tab, lewy, srodek, prawy);
}