Бесконечный цикл при использовании 'for' с указателем в качестве переменной цикла - PullRequest
0 голосов
/ 13 октября 2018

Я довольно новичок в кодировании и застрял с проблемой.Я пытался решить это сам и много гуглил, но у меня до сих пор нет решения этой проблемы.Может быть, один из вас может помочь?

Это мой код:

int main(int argc, char **argv) {
    struct node {
        char *str;
        int count;
        struct node *next;
    };

    struct node head = { argv[1], 1, NULL };
    for (int i = 2; i < (argc); i++) {
        for (struct node *p = &head; (p != NULL); p = p->next) {
            printf("%s,%s\n", argv[i], p->str);
            if (strcmp(argv[i], p->str) == 0) {
                printf("case1\n");
                p->count++;
                break;
            }
            else if ((strcmp(argv[i], p->str) != 0) && p->next) {
                printf("case2\n");
                printf("Adresse, auf die p zeigt: %p", &p);
                continue;
            }
            else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
                printf("case3\n");
                struct node *oldhead = &head;
                head.str = argv[i];
                head.count = 1;
                head.next = oldhead;
                break;
            }

        }
    }

    // Print how many times each string appears

    return 0;
}

Цель состоит в том, чтобы создать связанный список, содержащий все аргументы, которые я дал main() при вызове программы.Если есть дубликаты, структура должна их посчитать.Например, если я вызываю программу наподобие ./a.out foo fool foo, результатом должен быть список длины два, где первый элемент содержит строку "foo" и число 2, а второй элемент содержит строку "fool" и имеетколичество 1.Проблема в том, что else if -состояние внутри внутреннего цикла for.Это единственная часть, где должен фактически использоваться внутренний цикл for и присваивать p->next p.К сожалению, этого не происходит.В результате внутренний цикл for запускается снова и снова, и указатель p постоянно указывает на один и тот же адрес (я использовал printf, чтобы выяснить это).

Кто-нибудь из вас имеет представление, в чем может быть проблема здесь?Я перепробовал все, что мог, и попытался найти решение онлайн ...

Большое спасибо !!!

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Основная проблема здесь

struct node *oldhead = &head;

, которую вы должны сделать malloc:

struct node *oldhead = (struct node*) malloc(sizeof(struct node));

, так что вы действительно выделяете часть памяти для своего нового узла.И поскольку у вас есть malloc, вы должны также сделать free в конце вашей программы:

while(...) {
   free(deepest_node)
}

способ, которым вы выполняете цикл выше, состоит в том, чтобы перейти от самого дальнего узла в связанном спискевплоть до head.

Другая проблема заключается в том, что вы не должны добавлять свой новый узел к head:

head.next = oldhead;

, но должны быть к p, который является последним узлом в вашем связанном списке:

p -> next = oldhead;
0 голосов
/ 13 октября 2018

Проблема в этой части кода

   else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
        printf("case3\n");
        struct node *oldhead = &head;
        head.str = argv[i];
        head.count = 1;
        head.next = oldhead;
        break;
    }

Вам нужно выделить новую структуру и затем поместить ее адрес в последнюю запись структуры.

       else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
            printf("case3\n");
            struct node *oldhead = p;
            p = (struct node *) malloc(sizeof(node));
            if (p == NULL) { .... manage the error ... }
            oldhead->next = p;
            p->str = argv[i];
            p->count = 1;
            p->next = NULL;
            break;
        }

Теперь высоздаем узлы и связываем их вместе.Вы эффективно обновляли тот же node раньше.

0 голосов
/ 13 октября 2018
        struct node *oldhead = &head;
        head.str = argv[i];
        head.count = 1;
        head.next = oldhead;

Это не создание нового узла.Это просто создание новой ссылки на тот же узел, что вызывает бесконечный цикл при попытке прочитать связанный список до конца.Следовательно, ваша программа имеет только один узел.Вам действительно нужно выделять и создавать новые.

...