оператор if в поисковом списке связанных функций - PullRequest
1 голос
/ 30 апреля 2020

Я хочу найти в моем связанном списке строку, равную 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);
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Строки в C довольно хитры. Строки в C являются просто массивом. Так же, как массив int с одним небольшим, но существенным отличием: они должны заканчиваться '\0'.

Давайте посмотрим на эту часть вашего кода:

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

Согласно вашему коду, idf - это массив char. Точнее говоря, это указатель на первый элемент массива (так работают массивы в C). А как насчет x? Это тот же тип - указатель на первый элемент другого массива.

Так что p->idf == x делает сравнение адресов массивов. Если вы хотите сравнить со строками в C, у вас есть две функции: strcmp и strncmp.

Первая выполняет итерацию по массивам и сравнивает соответствующие значения, пока не достигнет \0 (конец строкового символа). Второй имеет один дополнительный аргумент, который сообщает функции, сколько сравнений он должен выполнить.

Все это может быть немного запутанным в начале, но идея указателей является очень мощной функцией, и это прямо сейчас, когда вы к этому привыкнете.

Если вы хотите узнать о строках в C, вам следует взглянуть здесь .

0 голосов
/ 30 апреля 2020

Вам нужно сравнивать заостренные строки, а не сами указатели.

Кроме того, функция имеет неопределенное поведение, если она вызывается для пустого списка.

Определение функции может выглядеть следующим образом

#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 );
}
...