【发布时间】:2014-02-13 22:53:37
【问题描述】:
我必须从文件中读取数据包,并按照block_num的顺序将数据包重构为链表。
struct packet {
unsigned short block_num;
unsigned short block_size;
unsigned short crc;
unsigned char *payload;
};
struct list {
struct packet p;
struct list *next;
};
这是我读取数据包并将它们添加到链表中的代码,但是我将如何根据 block_num 对它们进行排序?
FILE *infp;
struct list *head = NULL;
struct list *last = NULL;
while (fread(&p, sizeof(p), 1, infp) != NULL) {
packet *newpacket = malloc(sizeof(p));
struct list *newlist = malloc(sizeof(list));
newlist -> p = newpacket;
newlist -> next = NULL;
if (head == NULL) {
head = last = newlist;
} else {
last -> next = newlist;
last = newlist;
}
}
【问题讨论】:
-
@Smac89 不,他不是。阅读代码。 newList 是指向 newList 对象实例的指针,而不是整个列表。
-
你试过编译上面的代码吗?那里有很多错误,您可能应该先清理一下。例如
newlist -> p = newpacket这一行,其中newpacket是指针类型,但newlist->p不是。 -
如果你收集所有的数据包然后对它们进行排序,数组比链表更好。如果您希望每个数据包在到达时插入正确的位置,那么您可能需要考虑一个(平衡的)树结构。如果数据包按顺序或多或少但不完全按顺序到达,则“平衡”很重要。在这两者中,我可能会使用一个动态增长的数组,后跟
qsort()。如果你坚持,你可以把struct list结构的数组做成数组,当数据排序后,可以把数组转换成列表。
标签: c linked-list