2010-02-22 1 views
0

Я в основном пытаюсь создать связанный список из текстового файла и добавлять новый член каждый раз, когда слова разные, и увеличивать счетчик, если слова одинаковы (назначение hw). Я думал, что сделал это правильно, но, кажется, он добавляет участника, несмотря ни на что. Мне интересно, неправильно ли я просматриваю список во время поиска? Вот мой код. Есть предположения? Благодаря!Одиночные списки в C

LIST *CreateList(FILE *fp) 
{ 
    char input[LINE_LEN]; 
    LIST *root= NULL;    /* contains root of list    */ 
    size_t strSize;  
    LIST *newList;   /* used to allocate new list members */ 
    int same;    /* if string is same */ 

    while (fscanf(fp, BUFFMT"s", input) != EOF) { 

     strSize = strlen(input) + 1; 

      if (root == NULL) { 
       if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) { 
        printf("Out of memory..."); 
        exit(EXIT_FAILURE); 
       } 
       if ((newList->str = (char *)malloc(sizeof(strSize))) == NULL) { 
        printf("Not enough memory for %s", input); 
        exit(EXIT_FAILURE); 
       } 
       memcpy(newList->str, input, strSize); /*copy string */ 
       newList->count = START_COUNT; 
       newList->next = NULL; 
       root = newList; 
      } 
      /* if not root node, add node, or increment count */ 
      else { 
       same = ListSame(newList, input); 
       if (same == 1) { 
        root->count++; 
       } 
       else { 
        if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) { 
         printf("Out of memory..."); 
         exit(EXIT_FAILURE); 
        } 
        if ((newList->str = (char *)malloc(sizeof(strSize))) == NULL) { 
         printf("Not enough memory for %s", input); 
         exit(EXIT_FAILURE); 
        } 
        memcpy(newList->str, input, strSize); /*copy string */ 
        newList->count = START_COUNT; 
        newList->next = root->next; 
        root->next = newList; 
       } 
      } 
    } 
     return root; 
} 

int ListSame(LIST *head, char *input) 
{ 
    LIST *start = head; 
    for (; start != NULL; start = start->next) { 
     if (strcmp(head->str, input) == 0) { 
      return 1; 
     } 
    } 
    return 0; 
} 
+0

ли это с учетом регистра? Попробуйте использовать stricmp(), если нет. – vpram86

+2

ваш код будет легче следовать, если вы использовали «разделение проблем»; то есть извлечь код списка из кода разбора файла ... –

+1

'BUFFMT" s "' выглядит неправильно. 'BUFFMT"% s "' возможно? –

ответ

1

Вы звоните ListSame с NewList, который всегда будет только иметь последний созданный узел. Похоже, вы хотите передать root в ListSame.

Кроме того, в ListSame он всегда проверяет head-> str, а не start-> str, которая является вашей переменной цикла.

Кроме того, если ListSame возвращает true (1), вы увеличиваете значение root-> count; Я не уверен, если вы хотите увеличить счет корневого узла (подсчитать количество дубликатов) или счетчик для узла, который имеет дубликат (подсчитывайте, сколько раз каждое слово появляется). Если это последний, либо ListSame должен будет вернуть тот узел, который является дубликатом, либо потребуется увеличить счетчик.

Кроме того, способ, которым вы строите список, немного запутан. Когда вы говорите:

newList->next = root->next; 
root->next = newList;

корне-> следующая перед этим будет либо NULL, либо последний созданный узел. Поэтому, когда вы вставляете сюда, вы всегда вставляете его в качестве второго элемента в списке. Это, вероятно, не то, что вы хотите. Если вы хотите добавить, вы должны следить за хвостом и головой; если вы хотите предварять, просто установите newList->next = root; root = newList;

0
LIST *start = head; 
for (; start != NULL; start = start->next) { 
    if (strcmp(head->str, input) == 0) { 
     return 1; 
    } 
} 

вы должны использовать

strcmp(start->str