【发布时间】:2021-07-13 22:55:09
【问题描述】:
这些是队列和请求节点的结构定义
typedef struct request{
struct request * next;
int valid;
int request_id;
int check_acc_id;
struct transfer * transfers;
int num_transfers;
struct timeval starttime, endtime;
}request;
typedef struct queue{
struct request * head;
struct request * tail;
int num_jobs;
}queue;
这是初始化队列的函数
queue * createQueue(){
queue *que = (queue*)malloc(sizeof(queue));
que->num_jobs = 0;
que->head = NULL;
que->tail = NULL;
return queue;
}
在我的主程序中,我运行一个连续循环来获取用户输入。用户可以提出 3 种不同的请求。
int reqid = 1;
queue *que = createQueue();
char * command = malloc(200);
while(1){
printf("> ");
fgets(command, 200, stdin);
fixEnd(command);
reqid += runCommand(command, reqid, que);
/*if(req.valid == 1){
reqid = addToQueue(&req, que);
}*/
printReqInfo(que);
}
return 0;
用户输入被发送到 runCommand 函数以确定发出了什么请求并基于该请求创建一个请求节点。
int runCommand(char * command, int request_id, queue * que){
struct timeval time;
gettimeofday(&time, NULL);
int reqID = request_id;
request r;
r.request_id = reqID;
r.valid = 1;
r.check_acc_id = 0;
r.next = (request*)malloc(sizeof(request));
r.transfers = (transfer*)malloc(sizeof(transfer) * 10);
r.num_transfers = 0;
r.starttime = time;
char * req = malloc(200);
char * token = malloc(20);
token = strtok(command, " ");
strcpy(req, token);
if(strcmp(req, "CHECK") == 0){
token = strtok(NULL, " ");
int id = atoi(token);
r.check_acc_id = id;
return addToQueue(&r, queue);
}
else if(strcmp(req, "TRANS") == 0){
token = strtok(NULL, " ");
int count = 0;
while(token != NULL){
transfer t;
t.acc_id = atoi(token);
token = strtok(NULL, " ");
t.amount = atoi(token);
r.transfers[count] = t;
++count;
token = strtok(NULL, " ");
}
r.num_transfers = count;
return addToQueue(&r, queue);
}
else if(strcmp(req, "END") == 0){
printf("Exiting Process\n");
free_accounts();
exit(0);
}
else{
printf("Request Invalid: %s\n", command);
r.valid = 0;
return 0;
}
}
如果发出“CHECK”或“TRANS”请求,则请求节点将被添加到队列中,如果用户发出“END”请求,程序将退出。
这是将请求节点加入队列的函数
int addToQueue(request *req, queue * que){
//pthread_mutex_lock(&queue_mutex);
if(que == NULL || req == NULL){
printf("Request Not Added\n");
return 0;
}
if(que->num_jobs > 0){
if(que->tail == NULL){
que->tail = req;
que->head->next = req;
}
else{
que->tail->next = req;
que->tail = req;
}
}
else{
que->head = req;
que->tail = NULL;
pthread_cond_broadcast(&empty);
}
que->num_jobs += 1;
int x = req->request_id;
//pthread_mutex_unlock(&queue_mutex);
printf("< ID %d\n", x);
return 1;
}
我遇到的问题是每个请求节点都是相同的。第一个输入请求被正确处理,并且该请求被添加为队列的头部。当我输入第二个请求时,添加了请求节点,但头部也更改为与新输入相同的数据。当发出第三个请求时,所有三个请求节点的数据值都等于最新请求的值。
例如,如果我输入以下内容:
检查 1 检查 2 反式 5 100
当我从队列中的每个请求节点打印数据时,它应该如下所示:
ID:1 检查:1 编号:2 检查 2 编号:3 加速:5 上午:100
其中 ID 是请求 ID,从 1 开始并随着每个请求递增,CHECK 是要检查余额的帐户。对于交易请求,ACC 是进行交易的账户,AMT 是要存入/取款的美元金额。请注意,有关帐户的具体信息与问题并不真正相关,我只是对其进行了解释,以免混淆它们的来源。
但是,当我使用该输入运行程序时,输出如下:
ID:3 加速:5 上午:100 编号:3 加速:5 上午:100 编号:3 加速:5 上午:100
如果我再提出另一个请求,比如 CHECK 8,输出将变为
ID:4 检查:8 编号:4 检查:8 编号:4 检查:8 ID:4 检查:8
【问题讨论】:
-
请不要将代码作为图片提供。将代码包含为文本并设置格式(使用工具栏)。
-
抱歉,第一次在这里发帖
标签: c linked-list queue nodes