Одиночные связанные списки в C - PullRequest
0 голосов
/ 22 февраля 2010

Я в основном пытаюсь создать связанный список из текстового файла и добавлять новый член каждый раз, когда слова отличаются, и увеличивать счетчик, если слова совпадают (назначение hw). Я думал, что сделал это правильно, но, кажется, добавить участника, несмотря ни на что. Я задаюсь вопросом, неправильно ли я просматриваю список во время поиска? Вот мой код Какие-нибудь мысли? Спасибо! * * 1001

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;
}

Ответы [ 2 ]

1 голос
/ 22 февраля 2010

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

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

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

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

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

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

0 голосов
/ 22 февраля 2010
LIST *start = head;
for (; start != NULL; start = start->next) {
    if (strcmp(head->str, input) == 0) {
        return 1;   
    }
}

если вы используете

strcmp(start->str
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...