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