有pqueue.h如下
#ifndef HEADER_PQUEUE_H
#define HEADER_PQUEUE_H
typedef struct_pqueue{
pitem *items;
int count;
}pqueue_s;
typedef struct_pqueue *pqueue;
typedef struct_pitem{
unsigned char priority[8];
void *data;
struct_pitem *next;
}pitem;
typedef struct_pitem *piterator;
pitem *pitem_new(unsigned char *prio64be,void *data);
void pitem_free(pitem *item);
pqueue pqueue_new(void);
void pqueue_free(pqueue pq);
pitem *pqueue_insert(pqueue pq,pitem *item);
pitem *pqueue_peek(pqueue pq);
pitem *pqueue_pop(pqueue pq);
pitem *pqueue_find(pqueue pq,unsigned char *prio64be);
pitem *pqueue_iterator(pqueue pq);
pitem *pqueue_next(piterator *iter);
int pqueue_size(pqueue pq);
#endif /*! HEADER_PQUEUE_H */
pq_test.c如下: #include<stdlib.h>
#include<string.h>
#include"pqueue.h"
/*remember to change expected.txt if you change there values*/
unsigned char prio1[8]="supercal";
unsigned char prio2[8]="ifragili";
unsigned char prio3[8]="sticexpi";
static void
pqueue_print(pqueue pq)
{
pitem *iter,*item;
iter=pqueue_iterator(pq);
for(item=pqueue_next(&iter);item!=NULL;
item=pqueue_next(&iter)){
printf("item\t%02x%02x%02x%02x%02x%02x%02x%02x\n",
item ->priority[0],item->priority[1],
item ->priority[2],item->priority[3],
item ->priority[4],item->priority[5],
item ->priority[6],item->priority[7],
}
}
int main(void)
{
pitem *item;
pqueue pq;
pq=pqueue_new();
item=pitem_new(prio3,NULL);
pqueue_insert(pq,item);
item=pitem_new(prio1,NULL);
pqueue_insert(pq,item);
item=pitem_new(prio2,NULL);
pqueue_insert(pq,item);
item=pqueue_find(pq,prio1);
fprintf(stderr,"found %p\n",item->priority);
item=pqueue_find(pq,prio2);
fprintf(stderr,"found %p\n",item->priority);
item=pqueue_find(pq,prio3);
fprintf(stderr,"found %p\n",item->priority);
pqueue_print(pq);
for(item=pqueue_pop(pq);item!=NULL;item=pqueue_pop(pq))
pitem_free(item);
pqueue_free(pq);
return 0;
}
pq_test.sh如下: #!/bin/sh set -e ./pq_test | cmp $srcdir/pq_expected.txt-pq_expected.txt如下:
item 6966726167696c69item 7374696365787069item 737570657263616c
1.根据测试代码描述pqueue的工作原理。
2.请实现 pitem *pqueue_insert(pqueue pq,pitem *item);



另外,通过观察测试文件可以发现测试文件中的字符串是按照从小到大排列的,而且struct_pitem中的priority字段含义可以理解,这是一个优先级队列,priority字段代表队列的优先级,priority字段越小,优先级越高。
理解了队列的结构后,就可以写出插入的代码了。
pitem *pqueue_insert(pqueue pq, pitem *item) { if (!item) { return NULL; } if (pq->count == 0) { pq->items = item; count++; return pq->items; } // 查找要插入的位置 pitem *iter, *item2, *item_before = NULL; iter = pqueue_iterator(pq); for(item2=pqueue_next(&iter); item2!=NULL; item2=pqueue_next(&iter)) { int result = 0; for (int i=0; i<8; i++) { if (item[i] < item2[i]) { result = -1; } else if (item[i] < item2[i]) { result = 1; } } if (result == -1) { break; } item_before = item2; } if (!item_before) { // item需要插入到队列中的第一个位置 item_before = pq->items; pq->items = item; item->next = item_before; } else { pitem *tmp = item_before->next; item_before->next = item; item->next = tmp; } pq->count++; return item; }