Список: Взять исходный список SP и создать два новых списка SP1 и SP2. SP1 содержит нечетные узлы, а SP2 – четные - C (СИ)

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

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

Что-то карета не вывезла и превратилась в тыкву.
  1. не могу понять почему данные не записывают в SP2
  2. не понимаю почему в 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;
}

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

В данном коде используются структуры данных и функции для работы со связанными списками. Связанный список – это структура данных, состоящая из узлов, каждый из которых содержит значение и ссылку (или указатель) на следующий узел в списке.

  1. Создаются структуры данных:
    • TList - структура, представляющая узел связанного списка. Содержит целочисленное значение (value) и указатель на следующий узел (next).
    • typedef struct node_t TList;
    • Функции для работы со связанными списками:
      • Push - добавляет новый узел в начало списка.
      • Pop - удаляет и возвращает первый узел из списка.
      • Clear - удаляет все узлы из списка.
      • Print - выводит значения всех узлов списка.
      • GetGenList - создает список случайных целых чисел в заданном диапазоне.
      • One2Two - разделяет исходный список на два списка: SP1 содержит нечетные узлы, а SP2 – четные.
  2. В функции main создается список SP случайных целых чисел от 10 до 100.
  3. Затем вызывается функция One2Two, которая разделяет список SP на два списка SP1 и SP2.
  4. Выводятся списки SP1 и SP2.
  5. После этого вызывается функция Clear для очистки памяти от списков SP1 и SP2.
  6. В конце программы вызывается функция system(pause), чтобы программа не закрылась сразу после вывода списков.

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


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

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

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