【问题标题】:return char* within a while loop在 while 循环内返回 char*
【发布时间】:2013-02-18 21:45:12
【问题描述】:

我正在尝试打印一个 char* 但 while 循环的链表的内容 正在弄乱代码:

获取链表中下一项的函数:

char * list_next(list *l)
{
    list *currentPosition = NULL;
    currentPosition = l->next; //since the first node is a dummy value in the singly linked list

    while (currentPosition != NULL)
    {
        return currentPosition->charValue;
        currentPosition = currentPosition->next;
    }

    return NULL;
}

在我的主要:

char * item;
while(item = list_next(list))
    printf("%s ",item);

有人可以帮我吗?我很确定问题出在 while 内的回报 循环,但我似乎无法修复它

【问题讨论】:

  • 请发布一个演示您的问题的最小程序。
  • 如果你在 while 循环中返回,为什么不使用if 语句呢?我看到的另一个问题是您的列表可能以一个虚拟值开始,但是您遍历整个列表您的主要单元,因此只有一个虚拟值。
  • 如果 l 作为 NULL 传入会发生什么?坏事。至少断言。
  • @ComFreek 我不能只使用 if 语句,因为我有超过 1 个具有 char 值的节点。我的问题基本上是如何在一个方法中返回超过 1 个字符*

标签: c


【解决方案1】:

交换两条线。 return 立即退出函数。它应该是

currentPosition = currentPosition->next;
return currentPosition->charValue;

改为。

(更不用说其他人也指出的许多其他错误 - 由于范围混淆而无法实际更新 next 指针,取消引用之前缺少对 NULL 的检查等)

【讨论】:

  • 我刚刚在问题下写了一条评论,解释了 OP 在这里制造了一个 逻辑错误
  • @ComFreek Yap。也许我应该指出它——但是,这并不能解决问题。
  • 循环永远持续下去,列表中只有一个值
【解决方案2】:

您的程序,即使交换了返回位置,每次仍然只会打印列表中的“第二个”项目 - 如果它存在的话。您要么需要使用双指针来更新基值,要么想出一些更好的方法来迭代您的列表。

【讨论】:

  • 因为这真的感觉像是一个家庭作业问题,我不愿意在这里放置实际代码来解决它......
  • 因此我为 OP 添加了一些提示 ;)
  • 嗯,请不要添加到我的帖子中。编辑是为了语法和格式,而不是为了添加我什至不同意的想法......
  • 我对我的编辑抱歉。你是对的:这个问题不是社区维基。
【解决方案3】:

您将原始列表传递给 list_next()。我相信您将始终在永远循环中打印第二项。

我建议你可以简化如下:

char *item;
for (item=list->next; // Skip the first item as you said the first node is dummy.
     item != NULL; item=item->next) {
    printf("%s ",item->charValue);
} 

【讨论】:

  • 在 list_next() 方法中做一个 prinf 不是问题,问题是我需要返回链表中的所有 char 值
【解决方案4】:

您在评论中提到您只需要返回链表中的所有值。

function iterate(someNode)
   if someNode ≠ null
     node := someNode
     do
       do something with node.value [1]
       node := node.next
     while node ≠ someNode

来自这个Wikipedia articleCC BY-SA

现在您可以在代码中的位置 [1] 处简单地 printf()。但是,您似乎必须返回所有值。 因此,您必须创建一个(可能是动态的)数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2015-02-24
    • 2016-05-22
    • 2019-05-08
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多