Список: Взять исходный список SP и создать два новых списка SP1 и SP2. SP1 содержит нечетные узлы, а SP2 – четные - C (СИ)
Формулировка задачи:
Что-то карета не вывезла и превратилась в тыкву.
- не могу понять почему данные не записывают в SP2
- не понимаю почему в SP1 только последний элемент
Взять исходный список SP и создать два новых списка SP1 и SP2. SP1 содержит нечетные узлы, а SP2 – четные
#include <stdio.h> #include <conio.h> #include <stdlib.h> typedef struct SP { int val; SP *next; }; typedef struct SP1 { int val; SP1 *next; }; typedef struct SP2 { int val; SP2 *next; }; int main() { SP *first=NULL,*end=NULL, *list, *tmp; SP1 *first_SP1=NULL,*end_SP1=NULL,*chlist,; SP2 *first_SP2=NULL,*end_SP2=NULL,*nchlist; int n,i; printf("enter N:"); scanf("%d",&n); system("cls"); list=(SP*)malloc(sizeof(SP)); printf("val [1]: "); scanf("%d",&list->val); first=list; list->next = end; if(list->val % 2 == 0) { chlist=(SP1*)malloc(sizeof(SP1)); chlist->val = list->val; first_SP1 = chlist; chlist->next = end_SP1; } else { nchlist=(SP2*)malloc(sizeof(SP2)); nchlist->val = list->val; first_SP2 = nchlist; nchlist->next = end_SP2; } for (i = 1;i<n;i++) { list->next=(SP*)malloc(sizeof(SP)); list=list->next; printf("val [%d]: ",i+1); scanf("%d",&list->val); if(list->val % 2 == 0) { chlist->next=(SP1*)malloc(sizeof(SP1)); chlist = chlist->next; chlist->val = list->val; first_SP1 = chlist; chlist->next = end_SP1; } else { nchlist->next=(SP2*)malloc(sizeof(SP2)); nchlist = nchlist->next; nchlist->val = list->val; first_SP2 = nchlist; nchlist->next = end_SP2; } list->next=end; } system("cls"); printf("Список:\n"); list = first; i=1; while(list!=NULL) { printf("val[%d] = %d\n",i,list->val); list=list->next; i++; } printf("\nСписок чётных:\n"); chlist = first_SP1; i=1; while(chlist!=NULL){ printf("val[%d] = %d\n",i,chlist->val); chlist=chlist->next; i++; } printf("\nСписок нечётных:\n"); nchlist = first_SP2; i=1; while(chlist!=NULL){ printf("val[%d] = %d\n",i,nchlist->val); nchlist=nchlist->next; i++; } getch(); return 0; }
Не уж-то никто не знает (
Решение задачи: «Список: Взять исходный список SP и создать два новых списка SP1 и SP2. SP1 содержит нечетные узлы, а SP2 – четные»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct node_t { int value; struct node_t *next; } TList; //----------------------------------------------------------------------------- TList* Push(TList** list, int value) { TList* node = (TList*) malloc(sizeof(TList)); node->value = value; node->next = *list; *list = node; return *list; } //----------------------------------------------------------------------------- int Pop(TList** list) { int value = 0; if (*list) { TList* node = *list; *list = (*list)->next; value = node->value; free(node); } return value; } //----------------------------------------------------------------------------- void Clear(TList** list) { while (*list) { Pop(list); } } //----------------------------------------------------------------------------- void Print(TList* list) { for (; list; list = list->next) { printf("%d ", list->value); } printf("\n"); } //----------------------------------------------------------------------------- TList* GetGenList(size_t count, int min, int max) { TList* list = NULL; while (count--) { Push(&list, rand() % (max - min) + min ); } return list; } //----------------------------------------------------------------------------- void One2Two(TList** sp, TList** sp1, TList** sp2) { int value; *sp1 = *sp2 = NULL; while (*sp) { value = Pop(sp); if (value % 2) { Push(sp1, value); } else { Push(sp2, value); } } } //----------------------------------------------------------------------------- int main() { srand(time(NULL)); TList* sp = GetGenList(20, 10, 100); printf("sp: "); Print(sp); TList* sp1; TList* sp2; One2Two(&sp, &sp1, &sp2); printf("sp1: "); Print(sp1); printf("sp2: "); Print(sp2); system("pause"); Clear(&sp1); Clear(&sp2); return 0; }
Объяснение кода листинга программы
В данном коде используются структуры данных и функции для работы со связанными списками.
Связанный список – это структура данных, состоящая из узлов, каждый из которых содержит значение и ссылку (или указатель
) на следующий узел в списке.
- Создаются структуры данных:
- TList - структура, представляющая узел связанного списка. Содержит целочисленное значение (value) и указатель на следующий узел (next).
- typedef struct node_t TList;
- Функции для работы со связанными списками:
- Push - добавляет новый узел в начало списка.
- Pop - удаляет и возвращает первый узел из списка.
- Clear - удаляет все узлы из списка.
- Print - выводит значения всех узлов списка.
- GetGenList - создает список случайных целых чисел в заданном диапазоне.
- One2Two - разделяет исходный список на два списка: SP1 содержит нечетные узлы, а SP2 – четные.
- В функции main создается список SP случайных целых чисел от 10 до 100.
- Затем вызывается функция One2Two, которая разделяет список SP на два списка SP1 и SP2.
- Выводятся списки SP1 и SP2.
- После этого вызывается функция Clear для очистки памяти от списков SP1 и SP2.
- В конце программы вызывается функция system(
pause
), чтобы программа не закрылась сразу после вывода списков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д