0

我正在实现一个带有链表的队列,该链表将使用简单的命令在同一个程序中发送和接收数据,我想为队列中的每个数据添加一个计数器,值是新的、未决的或 ack。那么我是将它存储在一个数组中还是有任何其他方式,因为计数器的数量会很大?

#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; 
}
4

2 回答 2

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 QNodestruct Queue如果这是您所追求的,您也可以使用汇总计数器来密切关注每个状态中有多少节点。

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

于 2013-04-06T22:32:11.417 回答
0

您的节点中已经有了状态“计数器”,但是(正如 Jonathan Leffler 建议的那样)让我们将其称为状态或状态。在您的选择性重复 ARQ 协议实现的 ACKreceive()中,存在使用与确认一起发送的序列号访问节点(不仅是状态,还包括数据,以防重传)的问题;我们必须遍历链表才能到达正确的节点,但是在遍历过程中我们还可以释放已确认的节点,所以这是无害的。

不过,您可以改进您的数据结构。我们不需要每个节点都有一个明确的状态变量,因为状态是严格排序的。从列表的头到尾,首先有零个(或更多仅当您不立即释放)ACK 节点,其次有零个或多个 PENDING 节点,最后有零个或多个 NEW 节点。因此,为了维护状态信息,指向第一个 NEW(可能还有第一个 PENDING)节点的索引或指针就足够了。

于 2014-06-18T12:18:54.717 回答