【问题标题】:if statement in search function linked list搜索函数链表中的if语句
【发布时间】:2020-08-14 16:53:22
【问题描述】:

我想在我的链表中搜索等于 x 的字符串(函数搜索的参数)并返回它的值,但是每次函数返回“不存在”而我的列表中的 idf 正常存在。

我认为问题在于“if 语句”不起作用,我不知道如何解决它。

我的代码

typedef struct idf One;
struct idf {
    char *idf;
    int value;
    One *next;
};

typedef struct List_symb {
    One *head;
} List ;

int search(List T, char *x){
    One *p = T.head;
    while(p->next != NULL){
        if(p->idf == x){
            return p->value;
        }
        p = p->next;
    }
    printf("doesn't exist\n");
    exit(1);
}

【问题讨论】:

  • 您需要使用strcmp
  • 你的意思是我使用 : if(strcmp(p->idf) == x)? @kiranBiradar
  • @Jo101 strcmp 有两个参数
  • 您似乎从未检查过列表的最后一个节点。
  • @Jo101 不,if (strcmp(p->idf,x) == 0)

标签: c search linked-list singly-linked-list c-strings


【解决方案1】:

您需要比较指向的字符串而不是指针本身。

此外,如果为空列表调用该函数,则该函数具有未定义的行为。

函数定义如下所示

#include <string.h>

//...

int search( List *T, const char *s, int *value )
{
    One *p = T->head;

    while ( p != NULL && strcmp( p->idf, s ) != 0 ) p = p->next;

    int success = p != NULL;

    if ( success ) *value = p->value;

    return success; 
}

函数可以这样调用

List list = { NULL };
int value;

//...

if ( search( &list, "Hello", &value ) )
{
    printf( "The found value is %d\n", value );
}

【讨论】:

    【解决方案2】:

    C 中的字符串非常棘手。 C 中的字符串只是一个数组。就像一组 int 有一个小而显着的区别:它们必须以 '\0' 结尾

    让我们看看这部分代码:

    ...
    if(p->idf == x){
        return p->value;
    }
    ...
    

    根据您的代码,idfchar 的数组。更准确地说,它是指向数组第一个元素的指针(这就是数组在 C 中的工作方式)。 x 呢?它是同一类型 - 指向 不同 数组的第一个元素的指针。

    所以p-&gt;idf == x 所做的是比较数组的地址。如果你想与 C 中的字符串进行比较,你有两个函数可以做到这一点:strcmpstrncmp

    第一个遍历数组并比较对应的值,直到到达\0(字符串字符的结尾)。第二个有一个额外的参数,它告诉函数它必须执行多少次比较。

    一开始可能有点混乱,但是指针的概念是一个非常强大的功能,当你习惯它时它会很直接。

    如果你想了解 C 中的字符串,你应该看看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2010-09-23
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多