【问题标题】:Why does the code stop executing after the while loop?为什么代码在while循环后停止执行?
【发布时间】:2020-11-19 18:28:36
【问题描述】:

我正在做一个双向链表,但我发现当我以相反的顺序打印节点时,代码不起作用。似乎被前面的 while 循环卡住了。

这是代码:

#include <stdio.h>
#include <stdlib.h>

struct LLNode
{
    char name;
    struct LLNode *left;
    struct LLNode *right;
};

struct LLNode * createNode (char data)
{
    struct LLNode *temp; temp = (struct LLNode *)malloc(sizeof(struct LLNode));
    temp->name = data;
    temp->left = NULL;
    temp->right = NULL;
    return(temp);
};

int main()
{
    struct LLNode *curr=NULL;
    struct LLNode *head=curr;

    head = curr = createNode ('A') ;
    printf ("curr->name = %c\n", curr->name) ;

    printf ("head %c tail %c\n",head->name,curr->name) ;

    curr->right = createNode('B');
    printf ("curr->right->name = %c\n", curr->right->name) ;

    curr->right->left = curr,
    printf ("curr->right->left->name = %c\n", curr->right->left->name) ;

    curr = curr->right;
    printf ( "curr = %c\n" , curr->name) ;

    printf ("head %c tail %c\n",head->name,curr->name) ;

    curr->right = createNode('C');
    printf("curr->right->name = %c\n",curr->right->name);

    curr->right->left = curr;
    printf("curr->right->left->name = %c\n", curr->right->left->name);

    curr = curr->right;
    printf("curr->name= %c\n",curr->name);

    printf ("head %c tail %c\n",head->name,curr->name) ;

    printf ("Linked list from head to tail: ");

    while (curr!= NULL)
        {
            // Print nodes from beginning to end.
            printf("%c ", head->name);
            head = head->right;
        }

    printf ("Linked list in reverse: ");

    while (curr!= NULL)
        {
            // Print nodes in reverse order.
            printf("%c ", curr->name);
            curr = curr->left;
        }

    return 0;
}

执行while循环“从头到尾打印节点”后代码似乎停止了,但我不知道为什么。我尝试过使用break、continue等方法,还是无法解决这个问题。

谁能帮忙?

【问题讨论】:

  • 存在三个关于非匹配间接级别的编译器警告。请检查一下。第 23、42、51 行。
  • 你似乎只是在设置curr-&gt;right。你为什么不设置curr-&gt;left 值?您将无法向后遍历
  • 请注意,此站点不是用于查找代码中所有错误的实时对话。首选方法是使用调试器:)
  • 哦,我是一个新的C学习者,但是我以前没有听说过调试器,我也将尝试学习,谢谢您的建议! :D

标签: c while-loop doubly-linked-list


【解决方案1】:

您的代码中存在一些问题。除了不设置curr-&gt;left 值。我认为您迭代链接列表的方式;在第一次迭代结束时,head 将是NULL,并且控制不会进入反向打印循环。当您到达curr-&gt;left == NULLcurr-&gt;right == NULL 时,您需要在不移动头部的情况下跳出循环,具体取决于您是向前还是向后遍历。

我对您的代码进行了一些代码更改,并且能够看到所需的输出:

int main() {
    struct LLNode *curr=NULL;
    struct LLNode *head = curr;
    struct LLNode *prev = NULL;

    // Insert first Element
    head = curr = createNode ('A') ;
    printf ("curr->name = %c\n", curr->name) ;

    // Insert Second Element
    curr->right = createNode('B');
    printf ("curr->right->name = %c\n", curr->right->name) ;

    prev = curr;
    curr = curr->right;
    printf ( "curr = %c\n" , curr->name) ;

    // Insert Third Element
    curr->right = createNode('C');
    curr->left = prev;
    printf("curr->right->name = %c\n",curr->right->name);

    prev = curr;
    curr = curr->right;
    curr->left = prev;
    printf("curr->name= %c\n",curr->name);

    printf ("\nLinked list from head to tail: ");
    while (1) {
        // Print nodes from beginning to end.
        printf("%c ", head->name);
        if (head->right == NULL)
            break;
        head = head->right;
    }

    printf ("\nLinked list in reverse: ");
    while (1) {
        // Print nodes from beginning to end.
        printf("%c ", head->name);
        if (head->left == NULL)
            break;
        head = head->left;
    }

    return 0;
}

当我运行它时,我能够看到列表被正确打印:

curr->name = A
curr->right->name = B
curr = B
curr->right->name = C
curr->name= C

Linked list from head to tail: A B C 
Linked list in reverse: C B A

【讨论】:

  • 哦,所以写curr-&gt;right-&gt;leftcurr-&gt;left不一样,我想这就是为什么我现在不能运行代码的原因。非常感谢,因为我花了好几个小时才发现我的代码为什么不起作用。
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
相关资源
最近更新 更多