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