c - 为什么代码在while循环后停止执行?
问题描述
我正在做一个双向链表,但我发现当我以相反的顺序打印节点时,代码不起作用。似乎被前面的 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等方法,但仍然无法解决这个问题。
任何人都可以帮忙吗?
解决方案
您的代码中存在一些问题。除了不设置curr->left
值。我认为您迭代链接列表的方式;head 将NULL
在第一次迭代结束时,控制不会进入反向打印循环。curr->left == NULL
当您到达或curr->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
推荐阅读
- r - R Flexdashboard中的下载按钮宽度
- azure - 是否可以通过 Java sdk 在边缘设备模块上安排 DeviceJob Twin 更新?
- mysql - 在 MariaDB/MySQL 中以多级 JSON 查询特定值
- python-2.7 - 如何将小波滤波器应用于 MRI nifti 图像?
- php - 如何根据 PHP 中的会话数据将用户重定向到不同的页面?
- javascript - 将javascript参数传递到flask/sqlAlchemy/python数据库
- dart - 我如何在 TextSpan 中使用“垂直对齐:超级”
- reactjs - TS2339:类型“{}”上不存在属性“焦点”。使用 React 打字稿
- excel - 当有更多符合条件的值时,VBA for 循环仅返回一个值
- c# - VS 2017 WinForms 项目退出识别同一命名空间中的用户控件