Виктория
Виктория

Структуры в СИ, подскажите пожалуйста прав я или нет.



Всем привет.
Подскажите прав я или нет.
Вот код.

#include
#include
#include “que.h”

void insert (QUE **q, int item)
{ QUE *current=*q;
QUE *previous=0;
QUE *new_node;

while(current)
{ previous=current; current=current->next; }
new_node=(QUE*) malloc (sizeof (QUE));
new_node->info=item;
if (previous)
{ new_node->next=previous->next;
previous->next=new_node;
} else
{ *q=new_node;
(*q)->next=0; } }

Весь вопрос закдючается вот в этих строках
while(current)
{ previous=current; current=current->next; }
если (допустим) у нас в списке 3 элемента (1- голова, 2-элемент, 3-элемент)

1 итерация цикла.
записываем в previous адрес головы
2 итерация цикла
записываем в previous адрес 1 элемента списка... .
т. е в информационной части previous в итогде оказывается адрес последнего элемента а не 0.

далее
if (previous)
{ new_node->next=previous->next;
previous->next=new_node;

по сути мы после создания нового элемента должны записать в его информационную часть 0 но вот этот участок кода записывает адрес последнего элемента? .
Прав ли я?. Или объясните мне мою ошибку.

Вот сама структура
#define QUE struct que

QUE
{
int info;
QUE *next;
}

НК
Никита Климов

За такое оформление исходного кода в приличных местах и канделябром по башке можно схлопотать.

По сути эта функция должна называться append, т. к. элемент добавляется в конец списка. И видимо, она когда-то в своей молодости была функцией insert.

previous -- действительно последний элемент или NULL если список пуст.

new_node -- новый элемент списка

> new_node->info=item;
Здесь в новый элемент списка заносятся данные.

Далее:
if (previous)
{
// вот здесь такое "хитрое" присваивание new_node->next значения NULL (артефакт после переделки insert'а в append?)
new_node->next=previous->next;
// а вот здесь добавление элемента в список
previous->next=new_node;
} else
{
// а это добавление элемента, если список был пуст
*q=new_node;
(*q)->next=0; } }

> Вот сама структура
> #define QUE struct que
Точно, переделка линейного списка в очередь (QUE <-> queue).
Для очереди функции добавления/удаления можно назвать попроще, к примеру push/pop.

Похожие вопросы
Подскажите пожалуйста как найти 2n факториал на СИ?
Структуры в си. Нид хэлп.
Структуры в СИ. Подскажите плис где моя ошибка.
СИ, подскажите пожалуйста.
Структуры в СИ. Помогите пожалуйста
Структуры в СИ, подскажите пожалуйста.
Сортировка Структур по Алфавиту (Язык Си)
си шарп, структуры, конструкторы и т. д. прошу помочь
Использование значений из структуры в си
Структуры и объединения Си