2015-02-20 1 views
0

В настоящее время я работаю над своей домашней работой. В моей программе мне пришлось использовать очередь, поэтому я написал очередь со списком Linked. Но это не похоже на мой синтаксис.Как правильно реализовать очередь с использованием Связанный список

Так что я STRUCT

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; 

Я попытался рассмотреть некоторые вопросы о stackoverflow, похожие на мои. 1) Question1

Так что я сделал много логических и нелогичных попыток. Я попытался написать node-> next = & current, так как next является указателем, и он получит значение адреса. Но это не сработало :( Я также попытался сделать oposit * (node-> next) = current

Я, наконец, нашел правильный вариант для меня, но я не уверен. Если это то, что я хотел. думая, что я должен был иметь STRUCT NODE * следующий но если я изменить NODE * рядом с NODE рядом, чем я не получаю эти ошибки но я получаю разные один:.

Cluster.c:25:15: error: field ‘next’ has incomplete type 
    struct NODE next; 

Можете ли вы сказать мне, как устранить эту проблему?

+1

Эта строка: 'typedef NODE * Link;' это плохая идея, так как она создала typedef typedef \t , когда typedef'ing указателя, гораздо лучше использовать кодировку, чтобы включить какое-то указание в новое имя typedef относительно того, на что оно указывает, и что это указатель. предложите «typedef NODE * pNode», и никогда не существует какой-либо обоснованной причины для typedef определения структуры. просто используйте «struct Node» когда когда-либо понадобится и удалите модификатор typedef – user3629249

ответ

1

Попробуйте изменить struct NODE *next; на struct Node *next; в определенном состоянии o е вашей структуры

EDIT:

Глядя больше кода, я думаю, что у вас есть какие-то проблемы на указательных заданий. Например, я думаю, что Link current = *Queue; присваивает только данные Queue, а не адрес, поэтому вы не можете получить доступ к «внутри». Такая же проблема может быть и с предыдущей.

Кроме того, я действительно не понимаю, что цель Link, вы могли бы пойти только с NODE

+0

Спасибо! менялось изменение NODE на Node, но можно немного объяснить, почему NODE не работает, и Node делает это потому, что я думал, что это то же самое. – Vato

+1

Я думаю, что вы ошибаетесь в * Очередь. Потому что Queue уже является указателем (Link), поэтому, когда я передаю Queue в качестве аргумента, я передаю указатель на массив узлов. Поэтому мне нужно добавить *, чтобы сделать Link current = to Queue. Без * Я получаю ошибку. – Vato

+0

Поскольку вы определяете имя структуры, NODE, в самом конце определения, а между тем внутри структуры вы используете Node как своего рода псевдоним. – Lucky

1

отправленного кода представит множество проблем, когда поддерживается. Кроме того, код содержит несколько загроможденных областей, которые затрудняют понимание/отладку. Значимые имена переменных также очень помогают. Предложить:

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 
+0

Спасибо! Не могли бы вы объяснить, почему я должен поместить структуру в paramiters в Enqueue? Я имею в виду, почему я должен иметь struct Node * newNode вместо Node * newNode? – Vato

Смежные вопросы