5 WSKAŹNIKI I TABLICE
#define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int getline(char *, int); char *alloc(int);
/* readlines: wczytaj wiersze z wejścia */ int readlines(char *lineptr[j, int maxlines)
{
int len, nlines;
char *p, line[MAXLEN]; ^ nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >= maxlines 11 (p — alloc(len)) == NULL) return -1; else {
line[len-11 = ’\0’; /* usuń znak nowego wiersza */ strcpy(p, linę); lineptr[nlines++] = p;
}
return nlines;
I* writelines: wypisz wiersze na wyjście */ void writelines(char *lineptr| ], int nlines)
<
int i;
for (i = 0; i < nlines; i++) printf(”%s\n”, lineptrfi]);
}
Funkcja getline pochodzi z punktu 1.9.
Główną nowością jest deklaracja lineptr: char *lineptr[MAXLINES];
Mówi ona, że lineptr jest tablicą o MAXLINES elementach, z których każdy jeli; wskaźnikiem do znaków. Zatem lineptrfi] jest wskaźnikiem do znaku, a *lineptrf' jest tym wskazywanym znakiem, czyli pierwszym znakiem i-tego przechowaneg0 wiersza tekstu.
Sama lineptr jest nazwą tablicy, można ją więc traktować jak wskaźni. sposób, co inne nazwy tablic we wcześniejszych przykładach, a funkcję writelines można napisać inaczej:
Mi siol
S • I UJ
/* writelines: wypisz wiersze na wyjście */ void writelines(char *lineptr[], int nlines)
while (nlines— > 0)
printf(”%s\n”, *lineptr++);
■ }
Początkowo *lir>eptr wskazuje na pierwszy wiersz; każde zwiększenie przenosi lineptr do następnego wskaźnika wiersza, podczas gdy wartość licznika nlines za każdym razem maleje.
Mając już funkcje wejścia i wyjścia, możemy zająć się sortowaniem. Metoda szybkiego sortowania z rozdz. 4 wymaga kilku małych zmian: należy zmodyfikować deklaracje, a dla operacji porównania wywołać funkcję strcmp. Podstawowy algorytm pozostaje taki sam, co dodaje nam pewności, że będzie nadal poprawny.
I* qsort: uporządkuj teksty v[left)...v[right] rosnąco */ void qsort(char *v[ ], int left, int right)
int i, last;
void swap(char *v[], int i, int j);
if (left >= right) /* nic nie rób, jeśli tablica zawiera */ return; /* mniej niż dwa elementy */ swap(v, left, (left + right)/2); last = left;
for (i = left+1; i <= right; i++) if (strcmp(v[i), v[left]) < 0) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1); qsort(v, last+1, right);
Podobnie funkcja swap, zamieniająca miejscami wskazane elementy, wymaga jedynie banalnych zmian:
151