Доброго времени суток. Мне нужна помощь. Пусть и прозвучит это странно, мне надо объяснить эту программу, то есть объяснить, как она работает:
#include<stdio.h>
#include<stdlib.h>
struct list {
int field;
struct list * next;
};
int ft_atoi(char *str) {
int result = 0;
int sign = 1;
unsigned int i = 0;
while(str[i] == ' ' || str[i] == '\n') {
++i;
}
while(str[i] == '-' || str[i] == '+') {
if(str[i] == '-') {
sign = sign * -1;
}
++i;
}
while(str[i] >= '0' && str[i] <= '9') {
result = result * 10 + str[i] - '0';
++i;
}
return((int)(result*sign));
}
void ft_push(struct list ** headRef, int value) {
struct list * lst = (struct list*) malloc(sizeof(struct list));
lst->field = value;
lst->next = *headRef;
*headRef = lst;
}
void ft_push_end(struct list ** headRef, int value) {
struct list * current = *headRef;
if(current == NULL) {
ft_push(headRef, value);
}
while(current->next != NULL) {
current = current->next;
}
ft_push(&(current->next), value);
}
void ft_swap(struct list ** headRef, int numf, int nums) {
struct list * lstf = *headRef;
struct list * lsts = *headRef;
while(lstf->field != numf && lstf->next != NULL) {
lstf = lstf->next;
}
if(lstf->field == numf) {
while(lsts->field != nums && lstf->next != NULL) {
lsts = lsts->next;
}
if(lsts->field == nums) {
int temp = lstf->field;
lstf->field = lsts->field;
lsts->field = temp;
}
}
}
void ft_insert(struct list ** headRef, struct list * lst, int value) {
if(*headRef == NULL) {
return;
}
else if((*headRef)->field == value) {
while(lst) {
ft_push(headRef, lst->field);
lst = lst->next;
}
}
else {
struct list * headf = *headRef;
struct list * heads = *headRef;
struct list * lstf = lst;
int i = 0;
while(headf->field != value && headf->next != NULL) {
++i;
headf = headf->next;
}
if (headf->field == value) {
while(lstf->next) {
lstf = lstf->next;
}
while(i != 1) {
heads = heads->next;
—i;
}
heads->next = lst;
lstf->next = headf;
headf = lstf;
}
}
}
void ft_pop_n(struct list ** headRef, int index) {
if(*headRef == NULL) {
return;
}
struct list * lst = *headRef;
struct list * lprev = *headRef;
int i = 0;
while(lst && lst->field != index) {
lst = lst->next;
++i;
}
while(i > 1) {
lprev = lprev->next;
—i;
}
if(lst->field == index && lprev->field != lst->field) {
lprev->next = lst->next;
lst->next = lprev;
free(lst);
}
else if(lst->field == index && lst == lprev) {
*headRef = (*headRef)->next;
free(lst);
}
}
void ft_print_list(struct list * head) {
struct list * lst = head;
while(lst) {
printf("%d -> ", lst->field);
lst = lst->next;
}
printf("NULL.\n");
}
void ft_delete_list(struct list ** headRef) {
struct list * prev = *headRef;
while(prev) {
*headRef = (*headRef)->next;
printf("Deleting..\t[%d]\n", prev->field);
free(prev);
prev = *headRef;
}
printf("List was successfully deleted.\n");
}
int main(int args, char *argv[]) {
int arr_keys[args - 2];
struct list * head = NULL;
for(int i = 0; i < args - 1; ++i) {
arr_keys[i] = ft_atoi(argv[i + 1]);
}
for(int i = args - 2; i >= 0; —i) {
ft_push(&head, arr_keys[i]);
}
ft_print_list(head);
struct list * lst = NULL;
ft_push(&lst, 99);
ft_insert(&head, lst, 2);
ft_print_list(head);
ft_swap(&head, 12, 14);
ft_print_list(head);
ft_pop_n(&head, 2);
ft_print_list(head);
ft_delete_list(&head);
return(0);
}
Задание было такое:
односвязные списки.
Функции: добавление элемента в начало, конец, в n-ую позицию. Очистка всего списка, очистка n-ого элемента в списке.
Даю последние баллы!
Answers & Comments
Verified answer
Здравствуйте!
Эта программа реализует работу с односвязными списками и содержит функции для добавления элементов в начало и конец списка, добавления элемента в n-ую позицию, удаления элемента из списка, очистки всего списка и вывода списка на экран.
Код начинается с объявления структуры list, которая представляет узел списка. Узел содержит поле с данными (целое число) и указатель на следующий узел списка.
Затем идет функция ft_atoi, которая преобразует строку в целое число. Она используется в программе для преобразования аргументов командной строки в целые числа.
Далее идут функции для добавления элементов в начало (ft_push) и конец (ft_push_end) списка. Функция ft_push создает новый узел списка, присваивает ему значение и указатель на текущий головной узел списка, а затем делает созданный узел новым головным узлом списка. Функция ft_push_end добавляет элемент в конец списка, перебирая все узлы до тех пор, пока не будет найден последний узел, после чего использует ft_push для добавления нового узла в конец списка.
Функция ft_swap меняет местами значения двух элементов списка с заданными значениями. Она находит узел с первым значением и узел со вторым значением, и меняет их значения.
Функция ft_insert добавляет элементы списка перед узлом с заданным значением. Если список пуст, функция ничего не делает. Если узел с заданным значением является головным узлом списка, функция использует ft_push для добавления новых элементов в начало списка. В противном случае функция находит узел с заданным значением и устанавливает указатели таким образом, чтобы добавить новый список перед этим узлом.
Функция ft_pop_n удаляет узел со значением, соответствующим заданному значению. Если список пуст, функция ничего не делает. Если узел с заданным значением находится в середине списка, функция находит предыдущий узел и перенаправляет его указатель на следующий узел.
Функция ft_print_list выводит содержимое списка на экран.
Функция ft_delete_list удаляет все узлы списка и освобождает память, занятую ими.
В main функции программы создается список из аргументов командной строки и выводится на экран с помощью ft_print_list
Далее в коде определены несколько функций, которые реализуют необходимые операции со списком:
ft_swap - меняет местами значения двух элементов в списке, которые содержат заданные значения.
ft_insert - вставляет переданный список lst в список headRef после элемента со значением value.
ft_pop_n - удаляет элемент списка с заданным значением index.
Наконец, в функции main происходит создание списка из аргументов командной строки, демонстрация работы всех описанных выше функций и очистка списка.
В целом, программа предоставляет пример работы с односвязным списком на языке программирования C и реализует несколько операций, которые можно выполнять со списками.