链表中的搜索元素

时间:2013-12-30 23:19:36

标签: c linked-list

C编程新手和构建链表。

我需要一个函数来搜索链表中的元素,当我尝试运行代码并尝试搜索单词时,我知道它在那里它告诉我“单词未找到”

对我所拥有的任何帮助?

这是我的结构:

 struct node
  {
char data[100];
struct node *previous;  // Points to the previous node
struct node *next;   // Points out to the next node
 }*head, *last;

这是我的搜索功能:

 void search(struct node *head, char words[99])
 {
while (head != NULL)
{
    if (head->data[99] == words[99])
    {
        printf("word found\n");
        return;
    }
    head = head->next;
}
printf("word not found\n");
 }

这是我的主要内容:

            printf("\nEnter key to search: ");
            scanf("%s", &words[99]);
            search(head, words);

任何帮助?

3 个答案:

答案 0 :(得分:1)

首先,scanf将指针作为参数。而不是使用

scanf("%s", &words[99]); //which takes a pointer to the 100th char of the array

使用这行代码

scanf("%s", words); //which gives scanf a (char *), the place where the input should go. But this time it is the beginning of the array, not the 100th element

接下来

head->data[99] == words[99]

上面的行比较了每个字符串的第100个字符,而不是字符串。要做你想做的事,你需要将其替换为:

strcmp(head->data, words) == 0

将两个字符串作为参数,如果返回0,则表示两个字符串相等。

答案 1 :(得分:0)

一些事情......

首先,您需要在本地保存头指针的副本,以便不更改它。 在这样的简单列表中,可以自定义将最后一个元素的下一个指针设置为null,因此您的检查应该是:

struct node *current = head;

while (current->next != null) {
    if ((strcmp(current->data, words) == 0) {
        printf("Word found\n");
        break;
    }
    current = current->next;
}

另请注意,传入的字符串应与struct(100)中的字符串大小相同。

答案 2 :(得分:0)

C中的标准字符串是一个字节序列,带有一个特殊字符(零,也称为\ x00或有时是NUL),用作字符串终止符。

当你写

之类的东西时
char words[100];

然后你说你希望存在一个100字节的数组,并且你希望变量字是数组中第一个字节的内存地址。

您可以使用

将一些字节读入此数组
scanf("%s", words);

只要输入的字符数不超过99个字符,就可以正常工作 - 空字节终结符需要额外的第100个字符。

比较字符串比您使用的其他语言(如Java)更低级。您可以通过编写

来比较字符串
if( !strcmp(head->data, words) )

strcmp函数测试两个以null结尾的字节序列是否相等,如果它们是(奇怪的语义,但那就是C全部),则返回零。

您可能还想阅读scanf的手册页,了解限制写入数组的字符数的方法(如果用户输入超过99个字符会发生什么?)。

如果您的字符串可以包含空字节,那么C字符串对您来说是个问题:您需要使用不同的输入机制,为每个字符串存储长度和值,并使用memcmp进行比较。