【发布时间】:2011-07-03 22:30:11
【问题描述】:
当我必须插入很少的元素时,哪种方式可以更快地入队和出队,数组比链表好吗?
我需要插入一些元素,我必须从队列中删除并读取已删除的元素。 如果它是数组,我可能必须在每次删除元素时修改索引。插入和删除也可以同时发生。
下面的案例哪一个更好?
typedef struct{
mylist list;
struct mylistQ *next;
}mylistQ;
数组代码
static mylist myListQ[QUEUESIZE+1];
int qLast = 0;
void enqueue_element(mylist qItem)
{
myListQ[qLast] = qItem;
qLast++;
}
mylist dequeue_element()
{
retryq:
if(qLast >0) {
mylist qReturn = myListQ[0];
int i;
for (i = 0; i < qLast - 1; i++){
myListQ[i] = myListQ[i + 1];
}
qLast--;
return qReturn;
}
else {
goto retryq;
}
}
链接列表
int qLast = 0;
mylistQ *headElement = NULL;
mylistQ *tailElement = NULL;
void enqueue_element(mylist *List)
{
mylistQ *newnode;
newnode=(mylistQ*)av_malloc(sizeof(mylistQ));
newnode->next=NULL;
newnode->list=*List;
qLast++;
if(headElement==NULL && tailElement==NULL)
{
headElement=newnode;
tailElement=newnode;
}
else
{
tailElement->next=newnode;
tailElement=newnode;
}
}
mylist dequeue_element()
{
mylistQ *delnode; /* Node to be deleted */
mylist Dellist;
if(headElement==NULL && tailElement==NULL){
LOg( "Queue is empty to delete any element");
}
else
{
Log("In dequeue_picture queue is not empty");
delnode=headElement;
headElement=headElement->next;
if (!headElement){
tailElement=NULL;
}
Dellist = delnode->list;
av_free(delnode);
qLast--;
}
return Dellist;
}
【问题讨论】:
-
CPU 缓存位置为王。数组非常很难被击败。
-
@Hans:数组很难被击败,除非你需要调整它们的大小,或者它们对于你的缓存行来说太大了。不过,大小合理的数组的链接列表非常棒。
-
第二nmichaels。如果您希望它对小型和大型队列都快速,则最好使用数组的链表。
标签: c arrays linked-list deque