2015-01-20 3 views
1

Я новичок в C и пытаюсь закодировать программу для сортировки массивов символов, закорачивая массив указателей, указывающих на них (программа, как в D & K Язык программирования C pg -108). вот мой код-Программа C для сортировки массивов символов с использованием массива указателей

#include <stdio.h> 
#include <string.h> 
#define MAXLINES 5000 
#define MAXLEN 100 
char *line[MAXLINES]; 
int readlines(char *line[], int t); 
void writelines(char *line[], int t); 
void qsort(char *line[], int lo, int m); 
int getline(char *, int); 
char *alloc(int); 
int partition(char *line[], int lo, int m); 
int main() 
{ 
    int nlines; //no of input lines 
    if(nlines=readlines(line,MAXLINES)>=0) 
    { 

     qsort(line, 0, nlines-1); 
     writelines(line, nlines); 
     return 0; 
    } 
    else 
    { 
     printf("Error too many "); 
     return 1; 

    } 



} 
char store[10000]; //storage for alloc function 
char *p = store; 
char *alloc(int n) //next free position for allocating to the input lines 
{ 
    if (p + n <= store + 10000) 
    { 
     p += n; 
     return p - n; 
    } 
    else 
     return NULL; 
} 
int readlines(char *le[], int maxlines) //read the input lines to be sorted 
{ 
    char *p; 
    int i = 0; 
    char line[MAXLEN]; 
    int len; 
    while ((len=getline(line,MAXLEN)) > 0) 
    { 
     if ((i >= maxlines)||((p = alloc(len)) == NULL)) 
     { 
      return -1; 
     } 
     else 
     { 
      line[len - 1] = '\0'; 
      le[i++] = p; 
      strcpy(p, line); 
     } 

    } 
    return i; 

} 
void writelines(char *line[], int t) /*function to print lines after 
{           sorting */ 
    for (int i = 0; i <= t - 1; i++) 
     printf("%s\n",line[i]); 

} 
int getline(char a[], int t) //function to read a line 
{ 
    int i = 0;     //to count no of input char 
    int c; 
    while ((--t > 0) && (c = getchar()) != '\n'&&c != EOF) 
     a[i++] = c; 
     ; 
    if (c== '\n') 
     a[i++]='\n'; 
    a[i] = '\0'; 
    return i; 

} 

void qsort(char *line[], int lo, int m) /*function to quick sort the pointer 
{           array*/ 
    if (lo >= m) 
     return; 
    int p = partition(line,lo,m); 
    qsort(line,p+1,m); 
    qsort(line,lo,p-1); 


} 
int partition(char *line[], int lo, int m) /*function for partition in 
{            quick sort */ 
    int index=0; 
    char *t = line[m]; 
    for (int i = lo; i <= m - 1; i++) 
    { 
     if (strcmp(line[i], t) <= 0) 
     { 
      char *p = line[i]; 
      line[i] = line[index]; 
      line[index] = p; 
      index++; 
     } 
    } 
     char *p = line[m]; 
     line[m] = line[index]; 
     line[index] = p; 
     return index; 
} 

Он состоит из ряда функций, и я дал попытался дать описание сортировки each.Even после нескольких часов я был не в состоянии понять, почему он печатает первый вход line only. Пожалуйста, помогите выяснить, в чем проблемы в этом коде.

+2

Выполнить в отладчике, шаг через код построчно, следить переменных и их значений. –

+0

Что приводит к ошибкам типа 'ошибки конфликтующих типов для 'getline''? –

+0

ответ [здесь] (http://stackoverflow.com/questions/13112784/undefined-reference-to-getline-in-c) Я этого не знал! +1 для вопроса OP –

ответ

0

Вы должны заменить:

if(nlines=readlines(line,MAXLINES)>=0) 

... с

if((nlines=readlines(line,MAXLINES))>=0)