2016-09-09 1 views
2

следующая моя реализация очереди. Моя очередь - это просто массив из двух qnodes: head и rear. enqueue и dequeue должны обрабатывать внутреннюю реализацию очереди.Что случилось в этой реализации очереди?

Выход на Q[0].next == Q[1].next наступает 1 после того, как я вызываю enqueue с разными целыми числами. Я не могу понять ошибку.

struct Qnode{ 
int index; 
struct Qnode *next; 
}; 
typedef struct Qnode qnode; 

qnode* makeQueue(){ 
    qnode *Q; 
    Q = (qnode *) malloc(2*sizeof(qnode)); 
    qnode head,tail; 
    head.next = NULL; 
    tail.next = NULL; 
    head.index = 0; 
    tail.index = -1; 
    Q[0] = head; 
    Q[1] = tail; 
    return Q; 
} 

void enQueue(qnode *Q, int index){ 
    qnode node,head = Q[0], rear = Q[1]; 
    node.index = index; 
    node.next = NULL; 
    if(head.next == NULL && rear.next == NULL){ 
     head.next = &node; 
     rear.next = &node; 
    } 
    else{ 
     (rear.next)->next = &node; 
     rear.next = &node; 
    } 
    Q[0].index = head.index + 1; 
} 

Благодаря

+0

'malloc (2 * sizeof (qnode));'? – Groo

+0

как Q сам будет массивом из 2 qnodes –

+0

Во-первых, это не будет * массив * из 2 узлов, это будет * связанный список *, и вам нужен только главный узел, чтобы указать на первый узел или 'NULL'. Функция 'enqueue' должна выделять узлы по мере необходимости. [Пример] (https://gist.github.com/mycodeschool/7510222). – Groo

ответ

0

У вас есть проблема в enQueue функции

qnode node,head = Q[0], rear = Q[1]; 
node.index = index; 
node.next = NULL; 
if(head.next == NULL && rear.next == NULL){ 
    head.next = &node; 
    rear.next = &node; 
} 

кусок кода выше, присваивающей к head.next и rear.next адрес локальной контекстными переменной: т.е. суммироваться выделенную переменную.

node переменная будет существовать только до тех пор, пока функция не закончится. Таким образом, адрес в этих указателях недействителен вне функции: доступ к ней за пределами функции является незаконным и Undefined Behavior

Кроме того, все изменения, внесенные в эту функцию, не отражаются в массиве Q: вы изменяете локальную скопированную копию элементов массива.

+0

О, я вижу. Я попытался сменить узел на узел qnode *. Проблема все еще остается –

+0

Вы должны переосмыслить весь свой код. Этот путь неправильный, а не то, что вам нужно. Вы должны (я предполагаю) реализовать связанный список, а не массив из двух элементов, содержащих данные. – LPs

+0

Я думаю, что вторая проблема заключалась в том, что я делал изменения на голове и сзади, которые являются локальными переменными. Код работает сейчас. благодаря –

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

  • Нет связанных вопросов^_^