在链表中搜索

时间:2011-04-30 07:50:59

标签: c++

这是我在链表中​​搜索的代码,但它没有给我正确的结果。请帮帮我,我很担心。

search() {

  char ser[20];
  cout << "enter data to be searched" << endl;
  gets(ser);

  for ( start=head; start->ptr!=NULL; start=start->ptr ) {
    if ( start->info == ser ) {
      cout << "ok" << endl;
      break;
    }
  }
  cout << "not found" << endl;
}

谢谢, Saima Kanwal Bhutta

6 个答案:

答案 0 :(得分:1)

您对此有何看法?

if ( start->info == ser ) {

正在检查start->info是否指向ser数组的开头。您可能希望使用strcmp来比较字符串。

答案 1 :(得分:1)

赛马,

首先,欢迎来到论坛,并欢迎计算机编程的精彩,令人沮丧和富有成效的世界。

其次,我编辑了你的帖子。如果您现在单击edit按钮,您将看到如何布置源代码,因此论坛可以很好地显示它。

第三,我猜你的意思是return,你说break ...所以你不要总是看到“未找到”的消息。那是你想要的吗?

第四,我建议你从列表搜索部分中分离用户输入的部分...它很容易完成,它使链表列表搜索可以用任何字符串(从任何地方),而不仅仅是一个用户现在进入同样将搜索的输出分开,这样你可以在以后重新使用搜索,以产生适合环境的输出。

最后,那些变量名称(原谅我)很糟糕!

所以...我的ANSI-C版本看起来像这样:

int contains(char* target) {
  for ( Node node=head; node->next!=NULL; node=node->next ) {
    if ( strcmp(node->data, target)==0 ) {
      return 0; // TRUE
    }
  }
  return 1; // FALSE
}

以上是链接列表部分的“相当标准”名称,这有助于使您的代码更具可读性,因此可维护。 WTF也是一个“ser”......怎么样“目标”?

如果这完全是你的头脑,那么不要担心......暂时忽略这个建议。

干杯。基思。

答案 2 :(得分:0)

要比较2个字符串,请使用strcmp()。使用“==”将比较2个指针,而不是字符串的内容。

答案 3 :(得分:0)

在您的情况下,您应该比较字符串的内容而不是它们的起始地址。

正确版

void search() {

  char ser[20];
  cout << "enter data to be searched" << endl;
  gets(ser);

  for (start=head; start->ptr!=NULL; start=start->ptr)
  {
    if (strcmp(start->info, ser) == 0)
    {
      cout << "found" << endl;
      return;
    }
  }
  cout << "not found" << endl;
}

更多提及

您需要在head循环之前先检查for。否则,如果head为NULL,程序将崩溃。

答案 4 :(得分:0)

您的循环条件很危险。您没有检查'start'本身是否为NULL。此外,您将比较Next元素是否可用,从而在下一个元素不可用时丢失当前元素。字符串比较也不正确。按以下步骤更新循环:

for ( start=head; start != NULL; start=start->ptr ) {
        if ( strcmp(start->info, ser) == 0 ) {
          cout << "ok" << endl;
          break;
        }
      }

答案 5 :(得分:0)

获取是危险的,因为它无法指定缓冲区的长度。有一些替代方法可以与char数组一起使用,但是在这里使用std :: string会更容易。我已经将查找功能提取到一个单独的函数中。这使您可以使用相同的功能搜索列表,无论您如何获得要搜索的值,或者您想要使用它做什么。

Node* find(Node* head, const string& needle) {
    for (; head; head = head->ptr) {
        if (head->info == needle) {
            return head;
        }
    }
    return 0;
}

void search(Node* head) {
    string needle;
    cout << "Data to be searched: ";
    if (!getline(cin, needle)) {
        // Do something appropriate, such as throw an exception, return
        // an error code (if you change the function's interface), or
        // simply exit.
        abort();
    }

    Node* found = find(head, needle);
    if (found) {
        cout << "Found.\n";
    }
    else {
        cout << "Not found.\n";
    }
}