Разработать функцию создания односвязного списка с обратным расположением элементов - C (СИ)

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

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

Нужно написать функцию. Вот само задание: Разработать подалгоритм (функцию) создания односвязного списка с обратным расположением элементов по отношению к полученному списку, но без элемента, условный номер которого с начала полученного списка передан. Результат выполнения передать вызывающей функции. Вообщем пробовал сформировать список с конца из элементов другого списка, без элемента номер которого получен, но в итоге окончательно запутался. Вообщем вот вся программа(функция из задания new_list)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct line
    {
        char d[30];
        struct line*next;
    }LIST;

LIST input_kb(LIST *head_1, int n)
{
    char name[30];
    int i;
    LIST *new_1;
    //puts("Введите количество элементов");
    //scanf("%d", &n);
    fflush(stdin);
    head_1=NULL;
    getchar();
    for(i=0;i<n;i++)
    {
        puts("Введите строку");
        gets(name);
        new_1=(LIST*)malloc(sizeof(LIST));
        strcpy(new_1->d,name);
        new_1->next=head_1;
        head_1=new_1;
    }
    printf("\n");
    puts("Введенный список");
    for(i=0;i<n;i++)
    {
        printf("%s \n", new_1->d);
        new_1=new_1->next;
    }
return *head_1;
}
 
LIST new_list(int n, LIST *head_1)
{
    LIST *res,*cur,*cur1;
    int i,x=1,y=1;
    if(head_1!=NULL||head_1->next!=NULL)
    {
            for(i=0,cur=head_1;cur->next!=NULL;cur=cur->next)
            {
                i++;
            }
            res=cur;
            i=i-n;
            y=i;
            for(;cur->next!=head_1;cur=cur->next)
            {
                for(cur1=head_1;cur1->next!=cur;cur1=cur1->next)
                {
                    x++;
                }
                if(i==y-x)
                {
                    cur->next=cur1;
                }
            }

    return *res;
    }
    //else
    //{
    //    return NULL;
    //}
}

int main()
{
    int n, i, k;
    LIST *head_1, *new_1;
    puts("Введите количество элементов");
    scanf("%d", &n);
    //head_1=
    input_kb(*&head_1, n);
    puts("Введите номер элемента");
    scanf("%d", &k);
    new_list(n, *&head_1);
    puts("Результат");
    for(i=0;i<n;i++)
    {
        printf("%s \n", new_1->d);
        new_1=new_1->next;
    }
}
Функция не работает. Для ясности: res в функции это указатель на начало второго списка.

Решение задачи: «Разработать функцию создания односвязного списка с обратным расположением элементов»

textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
 
 
typedef struct list {
    int                 data;
    struct list *       next;
} list_t;
 
 
list_t * push_front_list(list_t * list, int data) {
    list_t * newList = malloc(sizeof(*newList));
    newList->data = data;
    newList->next = list;
    return newList;
}
 
void free_list(list_t * list) {
    while (list != NULL) {
        list_t * tmp = list;
        list = list->next;
        free(tmp);
    }
}
 
void print_list(list_t const* list) {
    while (list != NULL) {
        printf("%d ", list->data);
        list = list->next;
    }
}
 
list_t * new_list(list_t const* oldList, size_t excluded) {
    list_t * newList = NULL;
    size_t i = 0;
        
    while (i++ != excluded && oldList != NULL) {
        newList = push_front_list(newList, oldList->data);
        oldList = oldList->next;
    }
    
    if(oldList != NULL) {
        oldList = oldList->next;
    }
    
    while (oldList != NULL) {
        newList = push_front_list(newList, oldList->data);
        oldList = oldList->next;
    }
    
    return newList;
}
 
 
int main() {
    list_t * oldOne = NULL;
    list_t * newOne = NULL;
    size_t const excluded = 5;
    size_t i;
    
    for (i = 0; i != 10; ++i) {
        oldOne = push_front_list(oldOne, (int)i);
    }
    printf("oldOne: ");
    print_list(oldOne);
    printf("\n");
    
    newOne = new_list(oldOne, excluded);
    printf("newOne: ");
    print_list(newOne);
    printf("\n");
    
    free_list(oldOne);
    free_list(newOne);
    
    return EXIT_SUCCESS;
}

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

В данном коде представлена реализация односвязного списка, который в данном случае используется для хранения чисел в обратном порядке. Список начинается с NULL-указателя, то есть пуст.

  1. Функция push_front_list добавляет новый элемент в начало списка. Входные параметры: указатель на голову списка (list), данные, которые необходимо добавить в список (data). Выходной параметр: новый указатель на голову списка (newList). Вложенный цикл продолжает добавлять элементы до тех пор, пока не встретит NULL (конец списка). После чего добавляет новый элемент и обновляет указатель на голову списка. Важно отметить, что data передается в функцию без изменений, поэтому она не выполняет никаких дополнительных операций с этим параметром.
  2. Функция free_list освобождает память, выделенную под списком. Входной параметр: указатель на голову списка (list). Выполняет вложенный цикл, который проходит по всем элементам списка, начиная с головы, и освобождает память, выделенную под каждым элементом.
  3. Функция print_list выводит на экран все элементы списка. Входной параметр: указатель на голову списка (list). Выполняет вложенный цикл, который проходит по всем элементам списка, начиная с головы, и выводит значение каждого элемента.
  4. Функция new_list создает новый список, содержащий все элементы исходного списка в обратном порядке. Входные параметры: указатель на голову исходного списка (oldList), количество элементов, которые необходимо исключить из нового списка (excluded). Выходной параметр: указатель на голову нового списка (newList). Создает новый список, инициализируя его NULL. Затем выполняет два вложенных цикла. Первый цикл добавляет элементы в новый список до тех пор, пока не встретит NULL (конец списка) или не достигнет указанного количества элементов для исключения. Второй цикл продолжает добавлять элементы в новый список до тех пор, пока не встретит NULL (конец списка). Важно отметить, что в данной реализации список создается путем добавления элементов в начало списка, что не является эффективным способом работы со списками.
  5. В функции main создается исходный список из 10 элементов и выводится на экран. Затем создается новый список, содержащий все элементы исходного списка в обратном порядке, и также выводится на экран. После чего оба списка освобождаются с помощью функции free_list. В конце программы возвращается код успеха EXIT_SUCCESS.

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


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

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

12   голосов , оценка 4.083 из 5
Похожие ответы