profile
Размещено 2 года назад по предмету Информатика от kumiho9fox

Доброго времени суток. Мне нужна помощь. Пусть и прозвучит это странно, мне надо объяснить эту программу, то есть объяснить, как она работает:
#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-ого элемента в списке.
Даю последние баллы!

  1. Ответ на вопрос
    Ответ на вопрос дан tugoy

    Здравствуйте!

    Эта программа реализует работу с односвязными списками и содержит функции для добавления элементов в начало и конец списка, добавления элемента в 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 и реализует несколько операций, которые можно выполнять со списками.

    1. Ответ на вопрос
      Ответ на вопрос дан kumiho9fox
      спасибо
Не тот ответ на вопрос, который вам нужен?
Найди верный ответ
Самые новые вопросы
tegysigalpa2012
Русский язык - 6 лет назад

Помогите решить тест по русскому языку тест по русскому языку «местоимение. разряды местоимений» для 6 класса 1. укажите личное местоимение: 1) некто 2) вас 3) ни с кем 4) собой 2. укажите относительное местоимение: 1) кто-либо 2) некоторый 3) кто 4) нам 3. укажите вопросительное местоимение: 1) кем-нибудь 2) кем 3) себе 4) никакой 4. укажите определительное местоимение: 1) наш 2) который 3) некий 4) каждый 5. укажите возвратное местоимение: 1) свой 2) чей 3) сам 4) себя 6. найдите указательное местоимение: 1) твой 2) какой 3) тот 4) их 7. найдите притяжательное местоимение: 1) самый 2) моего 3) иной 4) ничей 8. укажите неопределённое местоимение: 1) весь 2) какой-нибудь 3) любой 4) этот 9. укажите вопросительное местоимение: 1) сколько 2) кое-что 3) она 4) нами 10. в каком варианте ответа выделенное слово является притяжательным местоимением? 1) увидел их 2) её нет дома 3) её тетрадь 4) их не спросили

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.