// Разработать программу слияния двух стеков, содержащих
// возрастающую последовательность целых положительных чисел,
// в третий стек так, чтобы его элементы располагались
// также в порядке возрастания.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//=== *** === *** === *** === *** ===
struct stack
{
char cifra;
struct stack *NextPtr;
};
typedef stack Stack;
typedef Stack *StackPtr;
struct stack m1, *p1 = &m1;
struct stack m2, *p2 = &m2;
struct stack m3, *p3 = &m3;
struct stack m4, *p4 = &m4;
// --------------------------------------------
void Push (StackPtr *BeginPtr, char znachenie) // внесение цифр в стек
{
while (znachenie != ".")
{
StackPtr NewPtr;
NewPtr = (Stack*)malloc(sizeof(Stack));
if (NewPtr != NULL)
{
NewPtr->cifra = znachenie;
NewPtr->NextPtr = (*BeginPtr);
(*BeginPtr) = NewPtr;
}
else
printf("Ne mogu vvesti znachenie v stack");
}
}
// --------------------------------------------
char Pop(StackPtr *BeginPtr) // удаление значения из стека
{
char popznachenie;
StackPtr tempPtr;
tempPtr = (*BeginPtr);
popznachenie = (*BeginPtr)->cifra;
(*BeginPtr) = (*BeginPtr)->NextPtr;
free(tempPtr);
return popznachenie;
}
// --------------------------------------------
void main()
{
int znachenie_1, znachenie_2;
printf("Dlya ostanovki zikla vvoda vvedite tochku");
printf("Vvedite zifru v 1-y stack");
scanf("%d", &znachenie_1);
Push (*p1 , znachenie_1);
printf("Vvedite zifru vo 2-y stack");
scanf("%d", &znachenie_2);
Push (*p2 -> BeginPtr, znachenie_2);
while (((*p1 -> BeginPtr) && (*p2 -> BeginPtr)) != NULL)
{
if ((*p1 -> BeginPtr) == NULL) // если первый стек пустой
Push (*p3 -> BeginPtr, Pop(*p2 -> BeginPtr)); // внести в 3-й содержимое 2-го стека
if ((*p2 -> BeginPtr) == NULL) //если второй стек пустой
Push (*p3 -> BeginPtr, Pop(*p1 -> BeginPtr)); // внести в 3-й содержимое 1-го стека
if ((Pop(*p1 -> BeginPtr)) >= (Pop(*p2 -> BeginPtr))) // если удаляемое значение 1-го стека >= знач. 2-го стека
{
Push (*p3 -> BeginPtr, Pop(*p1 -> BeginPtr)); // записать в 3-й сперва из 1-го стека
Push (*p3 -> BeginPtr, Pop(*p2 -> BeginPtr)); // затем записать в 3-й из 2-го стека
}
else
{
Push (*p3 -> BeginPtr, Pop(*p2 -> BeginPtr)); // записать в 3-й сперва из 2-го стека
Push (*p3 -> BeginPtr, Pop(*p1 -> BeginPtr)); // затем записать в 3-й из 1-го стека
}
}
// Извлечь из 3-го и внести в 4-й, т.е. менять порядок элементов в стеке
while (*p3 -> BeginPtr != NULL) // пока 3-й стек не пустой
Push (*p4 -> BeginPtr, Pop(*p3 -> BeginPtr); // извлечь из 3-го и внести в 4-й стек
}
Трудность с применением указателей
Помогите разобраться с программой. Вот ее код на языке СИ (Borland СИ):
Код:
У меня возникли трудности с переносом в функции указателей на структуры и вставляемые элементы.
Составлял программу пользуясь различной литературой, вот нестыковки и получаются.
В частности, как правильно описать функцию и как ее потом вызвать с использованием указателей. Плохо понимаю, поэтому, если не трудно, то напишите пример из программы и кратко пояснение к нему.
Помогите откорректировать программу.