我正在实现一个带有链表的队列,该列表将使用简单的命令在同一程序中发送和接收数据,我想为队列中的每个数据添加一个计数器,值为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;
}
答案 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)节点的索引或指针就足够了。