Сформировать список из элементов другого - C (СИ)

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

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

Здравствуйте! Нужна помощь со стеком. Задание: Подстановка, в которой новый список получается из исходящего списка путем подстановки Y взамен всех вхождений Х. Например L1=(b,a,c), X=a, Y=x, формируется L2=(b,x,c). Есть код для извлечения парных, как сделать подстановку:
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <windows.h>
#include <locale>
#include <math.h>
#define N 20
#define STACK struct stack 
 
int info;
 
STACK           //Структура стэка
{int info;
STACK* next;
};
 
void push(STACK **s,int item);              //прототип функции "вталкивания" в стэк
STACK* nechet (STACK *stack1,STACK *stack2);//прототип функции преобразования списка
void display(STACK *lst);                   //прототип функции вывода списка
STACK * create_list(int n);                 //прототип функции создания списка
STACK *list1,                               
      *list2;
 
void display(STACK *lst)                    
{STACK *current = lst;
  while(current)                            //цикл вывода списка
  {printf("%d --> ",current->info);
   current=current->next;                   //переход к следующему элементу списка
  }
}
 
void push(STACK**s,int item)                //функция записи значения в стэк
{ STACK *new_item;
    new_item=(STACK*)malloc(sizeof(STACK)); //выделение памяти под стэк
    new_item->info=item;
    new_item->next=*s;
    *s=new_item;}
 
STACK * create_list()               //функция создания списка
{STACK *list = NULL;                        //очистка списка
SetConsoleOutputCP(1251);
setlocale(LC_ALL,"RUSSIAN");
int done=0,c;
int info=0;
int n_list=0;
printf("Заполнение %d-го списка:\n",n_list);
while(done==0)                              //цикл заполнения списка
{ printf("Добавить новый элемент(Y/N)");    
c=getch(); c=toupper(c);                    //чтение символов Y/N
switch (c)                                  //подтверждение ввод/не ввод
{case 'Y': printf("\nЭлемент=");
            scanf("%d",&info);              //ввод элемента
             push(&list,info);              //запись элемента в список
              done=0;
                break;
 case 'N':  done=1;
                break;
    }
}
return(list);
}
 
STACK* nechet (STACK *stack1,STACK *stack2) //функция создания нового списка из нечетных элементов первого списка
{int k=0;                                   //переменная номера элемента
while(stack1)
{k++;
if((k % 2)==0)                              //проверка на четность/нечетность
    {push(&stack2,stack1->info);}
        stack1=stack1->next;    
    }
return(stack2);                             //функция возвращает новый список
}
 
void main()
{system("cls");
list1=create_list();                        //вызов функции создания списка
printf("Входной 1-йсписок имеетвид:\n"); 
display(list1);                             //вывод исходного списка
list2=nechet(list1,list2);
printf("\nВsходной 2-йсписок имеетвид:\n");
display(list2);                             //вывод списка-результата
getch();
}

Решение задачи: «Сформировать список из элементов другого»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
typedef struct node_t
{
   int value;
   struct node_t* next;
}  TNode;
 
//-----------------------------------------------------------------------------
TNode* Push(TNode** stack, int value)
{
   TNode* node = (TNode*) malloc(sizeof(TNode));
   node->value = value;
   node->next = *stack;
 
   *stack = node;
 
   return node;
}
//-----------------------------------------------------------------------------
int Pop(TNode** stack)
{
   int value = 0;
   TNode* node = *stack;
 
   if (node)
   {
      *stack = node->next;
      value = node->value;
      free(node);
   }
 
   return value;
}
//-----------------------------------------------------------------------------
TNode* GetModified(TNode** oldStack, TNode** newStack, int oldVal, int newVal)
{
   int val;
   oldVal = tolower(oldVal);
 
   if (*oldStack == NULL)
   {
      return *newStack;
   }
 
   val = Pop(oldStack);
   GetModified(oldStack, newStack, oldVal, newVal);
 
   if (tolower(val) == oldVal)
   {
      val = newVal;
   }
   Push(newStack, val);
 
   return *newStack;
}
//-----------------------------------------------------------------------------
void Print(const TNode* stack)
{
   for (; stack; stack = stack->next)
   {
      printf("%c, ", stack->value);
   }
   printf("\b\b \n");
}
//-----------------------------------------------------------------------------
TNode* GetStackFromStdin()
{
   TNode* stack = NULL;
   int ch;
 
   while ((ch = getchar()) && ch != '\n')
   {
      if (isalnum(ch))
      {
         Push(&stack, ch);
      }
   }
 
   return stack;
}
//-----------------------------------------------------------------------------
 
int main()
{
   printf("elements: ");
   TNode* stack = GetStackFromStdin();
   TNode* result = NULL;
 
   char oldChr, newChr;
 
   printf("old and new chars: ");
   scanf("%c %c", &oldChr, &newChr);
 
   printf("old: ");
   Print(stack);
 
   GetModified(&stack, &result, oldChr, newChr);
 
   printf("new: ");
   Print(result);
 
   return 0;
}

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

  1. Структура данных, используемая в коде, - это связанный список, представленный с помощью указателя на первый элемент (head) и реализованный с помощью структуры TNode.
  2. Функция Push добавляет новый узел в начало списка.
  3. Функция Pop удаляет и возвращает значение первого узла списка.
  4. Функция GetModified модифицирует список, заменяя все вхождения старого значения (после приведения к нижнему регистру) на новое значение.
  5. Функция Print выводит значения списка на экран.
  6. Функция GetStackFromStdin считывает строку символов из стандартного ввода и добавляет их в список.
  7. В функции main сначала считывается строка символов, затем пара символов для замены, после чего выводится исходный список, список после замены и результат выводится на экран.

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


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

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

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