【问题标题】:Split words with linked list in C++在 C++ 中使用链表拆分单词
【发布时间】:2013-10-16 00:43:28
【问题描述】:

我对链表有疑问。我写了一个函数想把一个句子分成单词。就像我有一个句子“我爱你”,它分成“我”、“爱”、“你”三个词。我有指向句子第一个字母的头指针。该函数将返回一个包含每个单词的头指针的数组。

它工作正常只有一个问题。如果一个词只有一个字母。它将与第二个单词结合。就像“我爱你”一样,它会给出“我爱”和“爱”、“你”这样的词。

想了很久,其他功能都很好用。我认为问题出在 for 循环中,有人可以帮忙吗?

Node* SplitToWords(Node* cursor){
int i=CountWords(cursor);

Node* array=new Node[i];
Node* t;
t=cursor;

for (int j=0; j<i-1; j++) {
    array[j]=*t;
    t=t->link;
    while (t->data!=' ') {
        cursor=t;
        t=t->link;
    }
    t=t->link;
    cursor->link=NULL;
}
array[i-1]=*t;

return array;
}

【问题讨论】:

  • 你是否在调试器中单步执行过它?
  • 考虑使用 Boost Tokenizer (boost.org/doc/libs/1_54_0/libs/tokenizer),它可以解决这个问题。
  • 是的,我试过了。我不知道为什么如果“cursor->link=NULL;”是一个字母词不工作...
  • 跟随调试器中的代码,不要说'我不知道为什么 cursor->link=NULL 不起作用'。你应该问,'我的代码没有按照我的预期做,所以它实际上在做什么'

标签: c++ arrays pointers linked-list


【解决方案1】:

您错误地处理了单词的第一个字母。这个array[j]=*t; 将节点复制到数组。最后cursor-&gt;link=NULL; 不会在此副本中进行任何更改,如果您只写一个字母。
要修复,您可以记住第一个节点并将其插入到 for 循环末尾的数组中

for (int j=0; j<i-1; j++) {
    Node *first_letter = t;
    t=t->link;
    while (t->data!=' ') {
        cursor=t;
        t=t->link;
    }
    t=t->link;
    cursor->link=NULL;
    array[j]=*first_letter;
}

【讨论】:

  • 非常感谢。我还在研究指针,我忘记了这个问题。谢谢你的帮助!!!!
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多