C 使用linux内核在链表中搜索特定值的最佳方法是什么?

C 使用linux内核在链表中搜索特定值的最佳方法是什么?,c,linked-list,linux-kernel,C,Linked List,Linux Kernel,我已经使用linux内核创建了一个链表,我正在尝试实现一种搜索链表的方法。我当前的实现使用“list\u for\u each\u entry”宏来迭代列表。然后,我检查是否找到了钥匙。如果存在,则打印“已找到密钥”,否则打印“未找到密钥” 我已经打印出了列表,所以我知道哪些键在那里,哪些不在那里,但是当我试图找到一个键时,我的程序只是打印出“找不到键”。我不确定我到底做错了什么 我试着在链表上迭代并检查键是否存在,但它一直说“找不到键”,即使我知道键在链表中 #include <s

我已经使用linux内核创建了一个链表,我正在尝试实现一种搜索链表的方法。我当前的实现使用“list\u for\u each\u entry”宏来迭代列表。然后,我检查是否找到了钥匙。如果存在,则打印“已找到密钥”,否则打印“未找到密钥”

我已经打印出了列表,所以我知道哪些键在那里,哪些不在那里,但是当我试图找到一个键时,我的程序只是打印出“找不到键”。我不确定我到底做错了什么

我试着在链表上迭代并检查键是否存在,但它一直说“找不到键”,即使我知道键在链表中

   #include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include <time.h>
#include <math.h>

struct a_list {
    struct list_head list;
    int   key;
    int value;
};

static void append(struct a_list* ptr,int value, int key) {
    struct a_list* tmp;
    tmp = (struct a_list*)malloc(sizeof(struct a_list));

    if(!tmp) {
        perror("malloc");
        exit(1);
    }
    tmp->value = value;
    tmp->key = key;
    list_add_tail( &(tmp->list), &(ptr->list) );
}


static inline long
time_diff(struct timespec start, struct timespec end) {
    long diff_in_nano = (end.tv_sec - start.tv_sec) * (long) 1e9 + (end.tv_nsec - start.tv_nsec);
    return diff_in_nano;
}




int main() {
    struct a_list  blist;
    struct a_list* iter;
    struct timespec start, end;

    INIT_LIST_HEAD(&blist.list);

    /* add item to list */
    //Start time
    clock_gettime(CLOCK_REALTIME, &start);
    for(int i = 0; i < 100; i++) {

        append(&blist, i, rand());

    }
    //End time
    clock_gettime(CLOCK_REALTIME, &end);

    // Display the time to add items to linked list
    printf("\033[1;34mTime taken to add items to linked list is: %ld us\033[0m\n", (long int)(time_diff(start, end)));

    /* iterates list and print key/value */
    //Start time
    clock_gettime(CLOCK_REALTIME, &start);
    list_for_each_entry(iter,&blist.list,list) {
        printf("%d %d\n", iter->value, iter->key);
    }
    clock_gettime(CLOCK_REALTIME, &end);
    printf("\033[1;34mTime taken to print the linked list is: %ld us\033[0m\n", (long int)(time_diff(start, end)));

    /* search the linked list */
    //Start time
    clock_gettime(CLOCK_REALTIME, &start);
    list_for_each_entry(iter,&blist.list,list) {
        if (iter->key == 1) {
            printf("Key found \n");
        }
        else {
            printf("Key not found \n");
        }
    }
                  //End time
                  clock_gettime(CLOCK_REALTIME, &end);

                  printf("\033[1;34mTime taken to search the linked list is: %ld us\033[0m\n", (long int)(time_diff(start, end)));



                  /* remove all items in the list */

                  //Start time
                  clock_gettime(CLOCK_REALTIME, &start);

                  while( !list_empty(&blist.list) ) {
                      iter = list_entry(blist.list.next,struct a_list,list);
                      if (iter->key == 6) {
                          printf("key found \n");
                      }
                      list_del(&iter->list);
                      free(iter);
                  }
                  // End Time
                  clock_gettime(CLOCK_REALTIME, &end);

                  // Display the time to delete 10 million items from the list
                  printf("\033[1;34mTime taken to remove all items from the list: %ld us\033[0m\n", (long int)(time_diff(start, end)));

                  return 0;
                  }
在代码中:

    for(int i = 0; i < 100; i++) {
        append(&blist, i, rand());
    }
for(int i=0;i<100;i++){
追加(&blist,i,rand());
}
您正在根据函数的签名传递参数:
value=i
key=rand()

static void append(结构列表*ptr,int值,int键)

这并不能确保您的密钥==1

:

函数的作用是:返回一个介于0到0之间的伪随机整数 RAND_MAX(即数学范围[0,RAND_MAX])


这与Linux内核有什么关系?我想他们的意思是他们从内核源代码中获得了列表的实现。你说得对!我也使用了错误的变量,因此它是我找不到键的原因。非常感谢。
    for(int i = 0; i < 100; i++) {
        append(&blist, i, rand());
    }