如何使用链表正确实现队列
How to correctly implement queue with using Linked list
我目前正在做作业。在我的程序中我不得不使用队列,所以我写了一个带有链表的队列。但它似乎不喜欢我的语法。
所以我有结构
typedef struct Node{
pthread_t thread;
int threadID;
int securityMode; // nTS = 1, S = 2, U = 3
//int cluseterHalf; //either 1st or 2nd
struct NODE *next;
int executionTime;
int isLast;
}NODE;
typedef NODE *Link;
这是我尝试入队的地方。
void Enqueue(Link node, Link *Queue){
Link previous = NULL;
Link current = *Queue;
while (current->isLast){
previous = current;
current = current->next;
}
if(previous == NULL){
node->next = current;
*Queue = node;
}
else{
previous->next = node;
node->next = current;
}
}
我尝试稍微更改我的代码,但出现此错误。
Cluster.c:162:13: warning: assignment from incompatible pointer type
[enabled by default]
current = current->next;
^
Cluster.c:165:16: warning: assignment from incompatible pointer type [enabled by default]
node->next = current;
^
Cluster.c:169:20: warning: assignment from incompatible pointer type [enabled by default]
previous->next = node;
^
Cluster.c:170:16: warning: assignment from incompatible pointer type [enabled by default]
node->next = current;
我试图查看一些与我类似的 Whosebug 问题。
1)Question1
所以我做了很多合乎逻辑和非合乎逻辑的尝试。我试着写
node->next = ¤t 因为 next 是一个指针,它将获取地址值。但它没有用:(
我也尝试做 oposit *(node->next) = current
我终于找到了适合我的选项,但我不确定这是否是我想要的。我在想我必须有 struct NODE *next
但是如果我将 NODE *next 更改为 NODE next 之后,我就不会收到这些错误。但我得到了不同的:
Cluster.c:25:15: error: field ‘next’ has incomplete type
struct NODE next;
你能告诉我如何解决这个问题吗?
谢谢!
尝试将结构定义中的 struct NODE *next;
更改为 struct Node *next;
编辑:
仔细查看代码,我认为您在指针赋值方面存在一些问题。例如,我认为 Link current = *Queue;
只会分配 Queue
的数据,而不是地址,因此您无法访问 "inside"。同样的问题可能与之前的问题有关。
另外,我不太明白Link
的目的是什么,你可以直接用NODE
贴出的代码在维护的时候会出现很多问题。此外,该代码包含几个混乱的区域,使 understanding/debugging 变得不必要地困难。有意义的变量名也有很大帮助。建议:
struct Node
{
pthread_t thread;
int threadID;
int securityMode; // nTS = 1, S = 2, U = 3
//int cluseterHalf; //either 1st or 2nd
struct Node *next;
int executionTime;
// notice removal of unneeded field isLast
};
void Enqueue(struct Node *newNode, struct Node **Queue)
{
struct Node *current = *Queue;
newNode->next = NULL;
if(NULL == current)
{ // then handle special case of empty linked list
*Queue = newNode;
}
else
{ // else, some nodes already in linked list
// loop to end of linked list
while (NULL != current->next)
{
// step to next node in linked list
current = current->next;
} // end while
// add node to end of linked list
current->next = newNode;
} // end if
} // end function: Enqueue
我目前正在做作业。在我的程序中我不得不使用队列,所以我写了一个带有链表的队列。但它似乎不喜欢我的语法。
所以我有结构
typedef struct Node{
pthread_t thread;
int threadID;
int securityMode; // nTS = 1, S = 2, U = 3
//int cluseterHalf; //either 1st or 2nd
struct NODE *next;
int executionTime;
int isLast;
}NODE;
typedef NODE *Link;
这是我尝试入队的地方。
void Enqueue(Link node, Link *Queue){
Link previous = NULL;
Link current = *Queue;
while (current->isLast){
previous = current;
current = current->next;
}
if(previous == NULL){
node->next = current;
*Queue = node;
}
else{
previous->next = node;
node->next = current;
}
}
我尝试稍微更改我的代码,但出现此错误。
Cluster.c:162:13: warning: assignment from incompatible pointer type
[enabled by default]
current = current->next;
^
Cluster.c:165:16: warning: assignment from incompatible pointer type [enabled by default]
node->next = current;
^
Cluster.c:169:20: warning: assignment from incompatible pointer type [enabled by default]
previous->next = node;
^
Cluster.c:170:16: warning: assignment from incompatible pointer type [enabled by default]
node->next = current;
我试图查看一些与我类似的 Whosebug 问题。 1)Question1
所以我做了很多合乎逻辑和非合乎逻辑的尝试。我试着写 node->next = ¤t 因为 next 是一个指针,它将获取地址值。但它没有用:( 我也尝试做 oposit *(node->next) = current
我终于找到了适合我的选项,但我不确定这是否是我想要的。我在想我必须有 struct NODE *next 但是如果我将 NODE *next 更改为 NODE next 之后,我就不会收到这些错误。但我得到了不同的:
Cluster.c:25:15: error: field ‘next’ has incomplete type
struct NODE next;
你能告诉我如何解决这个问题吗? 谢谢!
尝试将结构定义中的 struct NODE *next;
更改为 struct Node *next;
编辑:
仔细查看代码,我认为您在指针赋值方面存在一些问题。例如,我认为 Link current = *Queue;
只会分配 Queue
的数据,而不是地址,因此您无法访问 "inside"。同样的问题可能与之前的问题有关。
另外,我不太明白Link
的目的是什么,你可以直接用NODE
贴出的代码在维护的时候会出现很多问题。此外,该代码包含几个混乱的区域,使 understanding/debugging 变得不必要地困难。有意义的变量名也有很大帮助。建议:
struct Node
{
pthread_t thread;
int threadID;
int securityMode; // nTS = 1, S = 2, U = 3
//int cluseterHalf; //either 1st or 2nd
struct Node *next;
int executionTime;
// notice removal of unneeded field isLast
};
void Enqueue(struct Node *newNode, struct Node **Queue)
{
struct Node *current = *Queue;
newNode->next = NULL;
if(NULL == current)
{ // then handle special case of empty linked list
*Queue = newNode;
}
else
{ // else, some nodes already in linked list
// loop to end of linked list
while (NULL != current->next)
{
// step to next node in linked list
current = current->next;
} // end while
// add node to end of linked list
current->next = newNode;
} // end if
} // end function: Enqueue