在C中使用链表和计数器进行排队

时间:2013-04-06 19:16:29

标签: c linked-list queue

我正在实现一个带有链表的队列,该列表将使用简单的命令在同一程序中发送和接收数据,我想为队列中的每个数据添加一个计数器,值为new,pending或者确认所以我将它存储在数组中还是有其他方式,因为计数器的数量会很大?

#define TOTALPACKETS 100
#define WINDOW   5
#define ACK      2
#define PENDING  1
#define NEW      0 


typedef int Item ;
typedef struct node *link;  
struct node{                
    Item data;
    Item status;
    link next; 
};

int QUEUEempty(link head){
    return head==NULL;
}

void QUEUEput(link *head, link *tail, Item data, Item status){
    if (*head==NULL){
                    (*tail)=(link)malloc(sizeof(node)); 
                    (*tail)->data=data;
                    (*tail)->next=NULL;
                (*tail)->status=NEW;
                    *head=*tail;
                    return;}
    (*tail)->next=(link)malloc(sizeof(node));
    *tail=(*tail)->next;
    (*tail)->data=data;
    (*tail)->next=NULL;
    (*tail)->status=NEW;
    return;
}

Item QUEUEget(link *head){
    Item data=(*head)->data;
    Item status
    link t=*head;
    *head=(*head)->next;
    free(t);
    return data; 
}

2 个答案:

答案 0 :(得分:1)

我喜欢认为自己相当擅长阅读这些界限并暗中隐藏意图,但我无法很好地了解你所追求的目标。我会把它变成注释,除了在评论中有太多单词以适应,并且格式非常有限。 (这不是一个真正的答案 - 这就是CW的原因。)

你谈论的是一个具有三个值(NEW,PENDING,ACK)之一的'计数器'。这听起来更像是一个州或地位,而不是一个柜台。

让我们尝试一些设计;你可以说出错了。这假设一个非侵入式队列设计。

typedef struct Data Data;   /* This is the data that you're queueing - details TBS */

typedef struct QNode
{
    Data  *data;
    QNode *next;
    QNode *prev;
    ...possibly other data...status?
} QNode;

typedef struct Queue
{
    QNode *head;
    QNode *tail;
    ...possibly other data...counts?
} Queue;

extern int q_add(Queue *q, Data *d);    // Add datum d to queue per policy
extern int q_next(Queue *q, Data **dp); // Remove next datum from queue per policy

现在,至少有两个地方基于此大纲的系统可以存储计数器或状态。一个地方位于struct Data内,这是一种尚不透明的结构类型。另一个看似合理的地方是struct QNode。您可以通过struct Queue中的汇总计数器来监控每个州中有多少节点,如果这是您所追求的。

以此为出发点,你又追求什么?在这一点上,一切都是可变的 - 但如果没有具体的东西,我们就无法提供更多的帮助。

答案 1 :(得分:0)

你的节点中已经有了“counter”状态,但是(正如Jonathan Leffler建议的那样)让我们称之为状态或状态。 在选择性重复ARQ协议实现的ACK receive()中,存在访问节点的问题(不仅是状态,而且是在重传到期的情况下的数据),其中序列号与确认一起发送;我们必须遍历链表以到达正确的节点,但在此遍历期间,我们还可以释放已确认的节点,这样无害。

但是,您可以改善数据结构。我们不需要每个节点都有一个显式的状态变量,因为状态是严格排序的。从列表的头部到尾部,首先是零(或者只有在没有立即释放的情况下才有)ACK节点,第二个是零个或多个PENDING节点,最后有零个或多个NEW节点。因此,为了维护状态信息,指向第一个NEW(也许是第一个PENDING)节点的索引或指针就足够了。