让"列出"是一个表示单链表的结构,我有以下功能:
int List_contains(List node, const char* key) {
List *search;
search=node.next;
assert(search->key!=NULL);
return 1;
}
和List是以下结构:
typedef struct List { /*A new node*/
char* key;
void* value;
struct List *next;
} List;
功能" List_contains"应该告诉我是否"关键"是否包含在列表中。问题是,我无法遍历列表和行
assert(search->key != NULL);
抛出一个Segfault。我怎么能用我拥有的东西遍历列表呢?
(注意:该功能显然不是"已完成"。)
答案 0 :(得分:0)
以下是我写的一段时间的搜索示例。
struct node
{
int data;
struct node *next;
};
int
search_list(struct node *head, int search)
{
if (!head)
{
fprintf(stderr, "Invalid head\n");
return 1;
}
struct node *temp = head;
while (temp)
{
if (temp->data == search)
{
printf("Found %d\n", search);
break;
}
temp = temp->next;
}
return 0;
}
答案 1 :(得分:0)
int List_contains(List node, const char* key) {
List *search;
search=node.next;
assert(search->key!=NULL);
return 1;
}
这里要解析很多...
一般情况下,你会传递一个指向node
的指针,这样它就不会被复制,但实际上你做的事情是安全的,在这种情况下,假设没有多线程的恶作剧。 ..
但将来我会寻找:
int List_contains(List* node, const char* key) {
下一行你创建一个没有值的指针......这很好,因为你将它分配给下一行,但是可以压缩......
// List *search;
// search=node.next; # could easily become:
List *search = node.next;
现在,你现在知道你是否在列表的最后......
if(search == null)
{
return 0;
}
之后你需要做一些比较......
if (strcmp(key,search->key) == 0)
{
//found it;
return 1;
}
现在你有代码将匹配列表的第一个元素的键,所以你需要将整个事物放在一个循环中,每次迭代都用search
交换search->next
并检查空