You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将proc结构体数据传入队列函数存入void* info指针?

如何将proc结构体存入优先级队列的void* info字段

我需要从标准输入读取数据存入自定义的proc结构体,再将该结构体的信息存入优先级队列的Queue_element中的void* info指针。现有相关结构体及nolock_add_to_queue函数定义如下,且不能修改该添加函数,求实现方法。

proc结构体定义

typedef struct proc{
int creationTime;
int pid; 
int runTime;
int ioTime; 
int repeat;
}proc;

优先级队列结构体定义

// type of one element in a queue 
typedef struct _Queue_element {
  void *info; //<- THIS IS WHERE ALL INFO FROM THE PROCESS STRUCTURE WILL BE STORED WHEN ADDED TO THE QUEUE
  int priority;
  struct _Queue_element *next;
} *Queue_element;

//basic queue type
typedef struct Queue {
  Queue_element queue;                           
  Queue_element tail;                            
  Queue_element current;                         
  Queue_element previous;                         
  unsigned long queuelength;                         
  unsigned int elementsize;                       
  unsigned int duplicates;                      
  int (*compare) (const void *e1, const void *e2); 
  pthread_mutex_t lock;
  int priority_is_tag_only;    
} Queue;

nolock_add_to_queue函数定义

static void nolock_add_to_queue(Queue *q, void *element, int priority) {

  Queue_element new_element, ptr, prev = NULL;

  if (! q->duplicates && ! q->compare) {
    fprintf(stderr, "If duplicates are disallowed, the comparison function must be specified in init_queue().\n");
    exit(1);
  }
  
  if (!q->queue ||
     (q->queue && (q->duplicates || !nolock_element_in_queue(q, element)))) {

    new_element = (Queue_element) malloc(sizeof(struct _Queue_element));
    if (new_element == NULL) {
      fprintf(stderr, "malloc() failed in function add_to_queue()\n");
      exit(1);
    }
    new_element->info = (void *)malloc(q->elementsize);
    if (new_element->info == NULL) {
      fprintf(stderr, "malloc() failed in function add_to_queue()\n");
      exit(1);
    }

    memcpy(new_element->info, element, q->elementsize);

    new_element->priority = priority;

    (q->queuelength)++;

    if (q->queue == NULL) {             // first element
      new_element->next = NULL;
      q->queue = new_element;
      q->tail = new_element;
    }
    else if (q->priority_is_tag_only) { // FIFO queue
      q->tail->next = new_element;
      q->tail = new_element;
      new_element->next = NULL;
    }
    else {                              // priority queue
      ptr=q->queue;
      while (ptr != NULL && priority <= ptr->priority) {
    prev = ptr;
    ptr = ptr->next;
      }

      if (! prev) {   // queue only had one element and new element
              // has higher priority
    new_element->next=q->queue;
    q->tail = q->queue;
    q->queue=new_element;
      }
      else {         // insert new element 
    new_element->next = prev->next;
    prev->next = new_element;
    if (new_element->next == NULL) {
      // new tail
      q->tail = new_element;
    }
      }
    }
    
    nolock_rewind_queue(q);
    
  }
}

实现步骤

1. 初始化优先级队列

首先要确保队列的elementsize字段被正确设置为sizeof(proc),函数内部会根据这个值分配内存并拷贝数据。另外根据需求设置duplicates(是否允许重复元素)和compare函数(禁止重复时必须提供),示例初始化代码:

Queue my_queue;
// 初始化队列成员
memset(&my_queue, 0, sizeof(Queue));
my_queue.elementsize = sizeof(proc);
my_queue.duplicates = 1; // 允许重复元素,无需compare函数
// 如果禁止重复,需定义compare函数并赋值:
// int compare_proc(const void *e1, const void *e2) {
//     proc *p1 = (proc*)e1;
//     proc *p2 = (proc*)e2;
//     // 示例按pid比较,返回0表示相同
//     return p1->pid - p2->pid;
// }
// my_queue.duplicates = 0;
// my_queue.compare = compare_proc;
// 初始化互斥锁(后续需线程安全操作时使用)
pthread_mutex_init(&my_queue.lock, NULL);

2. 读取输入到proc结构体

从标准输入读取数据填充proc实例:

proc new_proc;
// 示例:从stdin读取五个整数对应proc的字段
scanf("%d %d %d %d %d", &new_proc.creationTime, &new_proc.pid, &new_proc.runTime, &new_proc.ioTime, &new_proc.repeat);

3. 调用nolock_add_to_queue存入队列

直接将new_proc的地址作为element参数传入,同时指定该元素的优先级:

// 示例:以creationTime作为优先级,可自定义规则
int priority = new_proc.creationTime;
nolock_add_to_queue(&my_queue, &new_proc, priority);

函数内部会自动根据my_queue.elementsize分配内存,并通过memcpy将new_proc的所有数据拷贝到new_element->info指向的内存区域,完成结构体的存储。

4. 从队列取出并访问proc数据(可选)

从队列中取出元素时,需将void* info强制转换为proc*类型来访问字段:

// 示例:获取队列首元素
Queue_element elem = my_queue.queue;
proc *p = (proc*)elem->info;
// 访问结构体字段
printf("PID: %d, Creation Time: %d\n", p->pid, p->creationTime);
// 释放内存:先释放info指向的内存,再释放Queue_element本身
free(p);
free(elem);

内容的提问来源于stack exchange,提问作者JSONdaMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:10:32