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

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

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

Нужно написать функцию. Вот само задание: Разработать подалгоритм (функцию) создания односвязного списка с обратным расположением элементов по отношению к полученному списку, но без элемента, условный номер которого с начала полученного списка передан. Результат выполнения передать вызывающей функции. Вообщем пробовал сформировать список с конца из элементов другого списка, без элемента номер которого получен, но в итоге окончательно запутался. Вообщем вот вся программа(функция из задания new_list)
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. #include<string.h>
  5.  
  6. typedef struct line
  7. {
  8. char d[30];
  9. struct line*next;
  10. }LIST;
  11.  
  12. LIST input_kb(LIST *head_1, int n)
  13. {
  14. char name[30];
  15. int i;
  16. LIST *new_1;
  17. //puts("Введите количество элементов");
  18. //scanf("%d", &n);
  19. fflush(stdin);
  20. head_1=NULL;
  21. getchar();
  22. for(i=0;i<n;i++)
  23. {
  24. puts("Введите строку");
  25. gets(name);
  26. new_1=(LIST*)malloc(sizeof(LIST));
  27. strcpy(new_1->d,name);
  28. new_1->next=head_1;
  29. head_1=new_1;
  30. }
  31. printf("\n");
  32. puts("Введенный список");
  33. for(i=0;i<n;i++)
  34. {
  35. printf("%s \n", new_1->d);
  36. new_1=new_1->next;
  37. }
  38. return *head_1;
  39. }
  40. LIST new_list(int n, LIST *head_1)
  41. {
  42. LIST *res,*cur,*cur1;
  43. int i,x=1,y=1;
  44. if(head_1!=NULL||head_1->next!=NULL)
  45. {
  46. for(i=0,cur=head_1;cur->next!=NULL;cur=cur->next)
  47. {
  48. i++;
  49. }
  50. res=cur;
  51. i=i-n;
  52. y=i;
  53. for(;cur->next!=head_1;cur=cur->next)
  54. {
  55. for(cur1=head_1;cur1->next!=cur;cur1=cur1->next)
  56. {
  57. x++;
  58. }
  59. if(i==y-x)
  60. {
  61. cur->next=cur1;
  62. }
  63. }
  64.  
  65. return *res;
  66. }
  67. //else
  68. //{
  69. // return NULL;
  70. //}
  71. }
  72.  
  73. int main()
  74. {
  75. int n, i, k;
  76. LIST *head_1, *new_1;
  77. puts("Введите количество элементов");
  78. scanf("%d", &n);
  79. //head_1=
  80. input_kb(*&head_1, n);
  81. puts("Введите номер элемента");
  82. scanf("%d", &k);
  83. new_list(n, *&head_1);
  84. puts("Результат");
  85. for(i=0;i<n;i++)
  86. {
  87. printf("%s \n", new_1->d);
  88. new_1=new_1->next;
  89. }
  90. }
Функция не работает. Для ясности: res в функции это указатель на начало второго списка.

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

textual
Листинг программы
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4.  
  5. typedef struct list {
  6.     int                 data;
  7.     struct list *       next;
  8. } list_t;
  9.  
  10.  
  11. list_t * push_front_list(list_t * list, int data) {
  12.     list_t * newList = malloc(sizeof(*newList));
  13.     newList->data = data;
  14.     newList->next = list;
  15.     return newList;
  16. }
  17.  
  18. void free_list(list_t * list) {
  19.     while (list != NULL) {
  20.         list_t * tmp = list;
  21.         list = list->next;
  22.         free(tmp);
  23.     }
  24. }
  25.  
  26. void print_list(list_t const* list) {
  27.     while (list != NULL) {
  28.         printf("%d ", list->data);
  29.         list = list->next;
  30.     }
  31. }
  32.  
  33. list_t * new_list(list_t const* oldList, size_t excluded) {
  34.     list_t * newList = NULL;
  35.     size_t i = 0;
  36.        
  37.     while (i++ != excluded && oldList != NULL) {
  38.         newList = push_front_list(newList, oldList->data);
  39.         oldList = oldList->next;
  40.     }
  41.    
  42.     if(oldList != NULL) {
  43.         oldList = oldList->next;
  44.     }
  45.    
  46.     while (oldList != NULL) {
  47.         newList = push_front_list(newList, oldList->data);
  48.         oldList = oldList->next;
  49.     }
  50.    
  51.     return newList;
  52. }
  53.  
  54.  
  55. int main() {
  56.     list_t * oldOne = NULL;
  57.     list_t * newOne = NULL;
  58.     size_t const excluded = 5;
  59.     size_t i;
  60.    
  61.     for (i = 0; i != 10; ++i) {
  62.         oldOne = push_front_list(oldOne, (int)i);
  63.     }
  64.     printf("oldOne: ");
  65.     print_list(oldOne);
  66.     printf("\n");
  67.    
  68.     newOne = new_list(oldOne, excluded);
  69.     printf("newOne: ");
  70.     print_list(newOne);
  71.     printf("\n");
  72.    
  73.     free_list(oldOne);
  74.     free_list(newOne);
  75.    
  76.     return EXIT_SUCCESS;
  77. }

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы