Сформировать список из элементов другого - 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;
}
Объяснение кода листинга программы
- Структура данных, используемая в коде, - это связанный список, представленный с помощью указателя на первый элемент (head) и реализованный с помощью структуры TNode.
- Функция Push добавляет новый узел в начало списка.
- Функция Pop удаляет и возвращает значение первого узла списка.
- Функция GetModified модифицирует список, заменяя все вхождения старого значения (после приведения к нижнему регистру) на новое значение.
- Функция Print выводит значения списка на экран.
- Функция GetStackFromStdin считывает строку символов из стандартного ввода и добавляет их в список.
- В функции main сначала считывается строка символов, затем пара символов для замены, после чего выводится исходный список, список после замены и результат выводится на экран.