当使用“ for”作为指针作为循环变量

时间:2018-10-13 17:36:44

标签: c pointers for-loop infinite-loop

我对编码还很陌生,并且遇到了问题。我尝试自己解决该问题,并进行了很多次谷歌搜索,但是我仍然没有解决方案。也许你们其中之一可以帮助您?

这是我的代码:

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这样调用程序,则结果应为长度为2的列表,其中第一个元素包含字符串"foo"并计数为2,第二个元素包含字符串"fool",计数为1。问题是内部for循环中的else if语句。这是实际应使用内部for循环并将p->next分配给p的唯一部分。不幸的是,这没有发生。结果是内部的for循环一遍又一遍地开始,并且指针p一直一直指向相同的地址(我用printf找出了)。

您有任何想法吗,这可能是什么问题?我竭尽所能,并尝试在网上找到解决方案...

非常感谢!

3 个答案:

答案 0 :(得分:1)

问题出在代码的这一部分

   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

答案 1 :(得分:0)

        struct node *oldhead = &head;
        head.str = argv[i];
        head.count = 1;
        head.next = oldhead;

这不是在创建新节点。它只是创建对同一节点的新引用,因此当您尝试读取链接列表直到最后时会导致无限循环。因此,您的程序只有一个节点。您实际上需要分配并创建新的。

答案 2 :(得分:0)

这里的主要问题是

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;