Списки, разобрать строку кода - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет. Подскажите прав я или нет. Вот код.
#include <alloc.h>
#include <stdio.h>
 
#define QUE struct que
 
QUE
{
   int info;
   QUE* next;
};
 
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 но вот этот участок кода записывает адрес последнего элемента? . Прав ли я?.Или объясните мне мою ошибку.

Решение задачи: «Списки, разобрать строку кода»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>//malloc();
 
#define QUE struct que
 
QUE
{
   int info;
   QUE* next;
};
 
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; } 
} 
//теперь сравни мою  addnode
void addnode(QUE **tail,int val) 
{
    QUE *temp;//используется только одна переменная
    temp=(QUE*) malloc(sizeof(QUE));//опять таки выделяем память под временный элемент
    //и тут самое интересное, у нас есть два элемента(две структуры) и нужно узгодить кто за кем будет идти
    (*tail)->next=temp; //передним будет новый, в виде нового это temp
    temp->next=NULL; //поскольку новый, пока что самый последний то справа нету ничего, то и присваиваем ем нуль указатель
    temp->info=val; //и дадим значение которые просили
    *tail=temp; //и перемещаем указатель (стрелочку по списку) что хвостом уже является новый элемент, т.к. хвост указывает последний элемент, чтоб потом добавлять к хвосту..
 
}
void inithead(QUE **head1,QUE **tail,int val)
{
    *head1=(QUE*)malloc(sizeof(QUE));
     (*head1)->next=NULL;//т.к голова это единственный элемент списка (на начале программы), то справа у нас нету ничего
      (*head1)->info=val;//для примера я дам ему значение 
     *tail=*head1;//т.к. 1 элемент то и хвост и голова это тоже самое
}
int main()
{
    int a[]={8,9,7},i;
    QUE *head,*temp,*tail;
 
    inithead(&head,&tail,a[0]);//создадим голову;
 
    for(i=1;i<sizeof(a)/sizeof(a[0]);i++)//в голове первый из массива, то тут уже со второго начинать
        addnode(&tail,a[i]);
 
    temp=head;
    for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
        printf("%2d ",temp->info);
        temp=temp->next;
    }
 
}

Объяснение кода листинга программы

Код представляет собой реализацию односвязного списка в языке C. Список состоит из структур, содержащих два поля: информацию и указатель на следующий элемент. Функция insert добавляет новый элемент в начало списка. Для этого код проходит по списку до конца, сохраняя предыдущий элемент в переменной previous. Затем код выделяет память под новый элемент, заполняет его информацией и связывает его с предыдущим элементом через указатель next. Если список пуст, то новый элемент становится и хвостом, и головой. Функция addnode добавляет новый элемент в конец списка. Код выделяет память под новый элемент, заполняет его информацией и связывает его с последним элементом списка через указатель next. Поскольку новый элемент становится последним, его указатель next указывает на NULL. Функция inithead инициализирует голову списка. Она выделяет память под первый элемент списка, заполняет его информацией и устанавливает указатель next в NULL, поскольку первый элемент должен быть связан только сам с собой. В функции main создается список из трех элементов. Сначала вызывается функция inithead, чтобы создать голову списка. Затем в цикле вызывается функция addnode, чтобы добавить два элемента в конец списка. После этого в цикле по всем элементам списка выводится информация каждого элемента.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5