Codigo do livro :" C A linguagem de Programação Padrão Ansi : Dennis Ritchie" não funciona

Olá pessoal, eu estudo a linguagem c pelo livro do Dennis Ritchie : C A
linguagem de Programação Padrão Ansi. No capítulo 5 de Apontadores e
vetores, na parte 5.6 : “Vetores de Apontador; Apontadores para
apontadores”, tem um código que eu não consigo compilar, a mensagem de
erro é : “na função lelinhas': Ex_pag_107.c:(.text+0x129): referência indefinida paraaloca’ collect2: error: ld returned 1 exit status”.
Bom, o erro é nessa parte : “if(nlinhas >= maxlin || (p = aloca(tam))
== NULL)” na função “lelinhas”.Eu não entendi a construção : “char
*aloca(int);” aloca é um ponteiro de tipo char, mais eu não entendi o
(int).

Na função original : “int lelinha(char *, int)”, porque não têm os
nomes das variáveis?(essa função foi modificada no código, acrescentando
os nomes das variáveis)

O código :

`# include <stdio.h>

include <string.h>

define MAXLIN 500

char *ptrlinha[MAXLIN]; // ponteiros para linhas de texto

int lelinhas(char *ptrlinha[], int nlinhas);
void imprlinhas(char *ptrlinha[], int nlinhas);

void qsort(char *v[], int esq, int dir);

int main(void){

int nlinhas;
if((nlinhas = lelinhas(ptrlinha,MAXLIN)) >= 0){

  qsort(ptrlinha, 0, nlinhas - 1);
  imprlinhas(ptrlinha, nlinhas);
  return 0;

}else{

printf(“Erro: entrada muito grande\n”);
return 1;

}

}

define TAMMAX 1000

int lelinha(char *s, int lim); // int lelinha(char *, int)
char *aloca(int); // ??

int lelinha(char *s, int lim){

int c, i;

for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != ‘\n’; ++i)
s[i] = c;
if(c == ‘\n’){

s[i] = c;
++i;

}

s[i] = ‘\0’;
return i;

}
int lelinhas(char *ptrlinha[], int maxlin){

int tam, nlinhas;
char *p, linha[TAMMAX];

nlinhas = 0;
while((tam = lelinha(linha, TAMMAX)) > 0 )
  if(nlinhas >= maxlin || (p = aloca(tam)) == NULL)
    return -1;
  else{
    linha[tam - 1] = '\0';
    strcpy(p,linha);
    ptrlinha[nlinhas++] = p;

}

return nlinhas;

}

void imprlinhas(char *ptrlinha[], int nlinhas){

int i;

for(i = 0; i < nlinhas; i++)
  printf("%s\n",ptrlinha[i]);

}

void qsort(char *v[], int esq, int dir){

 int i, ultimo;
 void troca(char *v[], int i, int j);

 if( esq >= dir)
   return;

 troca(v, esq, (esq + dir)/2);
 ultimo = esq;
 
 for( i = esq + 1; i <= dir; ++i)
   if( v[i] < v[esq])
     troca(v, ++ultimo, i);
 troca(v, esq, ultimo);
 qsort(v, esq, ultimo-1);
 qsort(v, ultimo+1,dir);

}

void troca(char *v[], int i, int j){

char *temp;

temp = v[i];
v[i] = v[j];
v[j] = temp;

}`