Списки, разобрать строку кода - 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; }
if (previous) { new_node->next=previous->next; previous->next=new_node;
Решение задачи: «Списки, разобрать строку кода»
#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
, чтобы добавить два элемента в конец списка. После этого в цикле по всем элементам списка выводится информация каждого элемента.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д