K
koly
помогите пожалуйста!!!Дана двусвязный список и нужно создать его и нужно найти в нём убывающую последовательность и удалить её,вот в чём проблема, программа сама есть ,все функции есть и всё запускается, но не хочет работать функция удаления убывающей последовательности...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#define N 100
struct ring
{
int inf[N];
ring *Next ,
*Prev ;
};
void see (ring *);
void add (ring **);
void Ring_DeleteElement( ring **s);
void Ring_DeleteDecreasing(ring **s) ;
int main()
{
int *Next = NULL,*Prev = NULL;
setlocale(LC_ALL, "Rus");
ring *s=NULL;
while(1) // бесконечный цикл.
{
printf("Вид операции: \n\n");
printf("1 - создание \ добавление в кольцо: \n");
printf("2 - удаление \n");
printf("3 - просмотр \n");
printf("0 - окончить работу \n");
fflush(stdin);
switch( getch())
{
case '1': add(&s); break;
case '2': Ring_DeleteDecreasing (&s); break;
case '3': if(s) see(s);
else puts("Кольцо пустое"); getch(); break;
case '0': return 0;
}
}
}
void add (ring **s)
{
ring *s1; // указатель
s1=(ring*)malloc( sizeof(ring)); // Выделение памяти.
if (!s1) // Проверка выделения памяти.
{
puts ("Память не выделена");
return;
}
puts ("Введите информацию: ");
scanf("%s",s1->inf);
if (!*s)
{
(*s)->Prev = (*s)->Next = (*s)=s1;
}
else
{
s1->Prev = (*s); // Кольцо уже существует.
s1->Next = (*s)->Next;
(*s)->Next->Prev = s1;
(*s)->Next = s1;
}
}
void see (ring *s)
{
ring *s1 ;
s1=s;
if (!s)
{
puts("Кольцо не создано");
return;
}
puts(" Вывод");
fflush(stdin); // чистим поток.
do
{
printf ("%s\n",s1->inf);
s1 = s1 ->Next;
} while (s1!=s);
}
// удаление элемента из кольца
void Ring_DeleteElement( ring **s)
{ ring *s1 ;
s1=*s;
if ((*s)->Prev == *s)
{
free(*s);
*s = NULL;
}
else
{
(*s)->Prev->Next = (*s)->Next;
(*s)->Next->Prev = (*s)->Prev;
*s = (*s)->Prev;
free(*s);
}
}
// удаление убывающих последовательностей из кольца
void Ring_DeleteDecreasing(ring **s)
{ ring *s1 ;
s1=*s;
int flag = 0;
if (!(*s) || ((*s)->Next == *s))
return;
ring *NastElement = (*s);
do
{
NastElement = NastElement->Next;
if (NastElement->Prev->inf > NastElement->inf)
{
Ring_DeleteElement(&(NastElement->Prev));
flag = 1;
continue;
}
else
{
if (flag)
Ring_DeleteElement(&(NastElement->Prev));
flag = 0;
}
} while((NastElement != *s) && NastElement);
if (flag && NastElement)
Ring_DeleteElement(&(NastElement->Prev));
*s = NastElement;
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#define N 100
struct ring
{
int inf[N];
ring *Next ,
*Prev ;
};
void see (ring *);
void add (ring **);
void Ring_DeleteElement( ring **s);
void Ring_DeleteDecreasing(ring **s) ;
int main()
{
int *Next = NULL,*Prev = NULL;
setlocale(LC_ALL, "Rus");
ring *s=NULL;
while(1) // бесконечный цикл.
{
printf("Вид операции: \n\n");
printf("1 - создание \ добавление в кольцо: \n");
printf("2 - удаление \n");
printf("3 - просмотр \n");
printf("0 - окончить работу \n");
fflush(stdin);
switch( getch())
{
case '1': add(&s); break;
case '2': Ring_DeleteDecreasing (&s); break;
case '3': if(s) see(s);
else puts("Кольцо пустое"); getch(); break;
case '0': return 0;
}
}
}
void add (ring **s)
{
ring *s1; // указатель
s1=(ring*)malloc( sizeof(ring)); // Выделение памяти.
if (!s1) // Проверка выделения памяти.
{
puts ("Память не выделена");
return;
}
puts ("Введите информацию: ");
scanf("%s",s1->inf);
if (!*s)
{
(*s)->Prev = (*s)->Next = (*s)=s1;
}
else
{
s1->Prev = (*s); // Кольцо уже существует.
s1->Next = (*s)->Next;
(*s)->Next->Prev = s1;
(*s)->Next = s1;
}
}
void see (ring *s)
{
ring *s1 ;
s1=s;
if (!s)
{
puts("Кольцо не создано");
return;
}
puts(" Вывод");
fflush(stdin); // чистим поток.
do
{
printf ("%s\n",s1->inf);
s1 = s1 ->Next;
} while (s1!=s);
}
// удаление элемента из кольца
void Ring_DeleteElement( ring **s)
{ ring *s1 ;
s1=*s;
if ((*s)->Prev == *s)
{
free(*s);
*s = NULL;
}
else
{
(*s)->Prev->Next = (*s)->Next;
(*s)->Next->Prev = (*s)->Prev;
*s = (*s)->Prev;
free(*s);
}
}
// удаление убывающих последовательностей из кольца
void Ring_DeleteDecreasing(ring **s)
{ ring *s1 ;
s1=*s;
int flag = 0;
if (!(*s) || ((*s)->Next == *s))
return;
ring *NastElement = (*s);
do
{
NastElement = NastElement->Next;
if (NastElement->Prev->inf > NastElement->inf)
{
Ring_DeleteElement(&(NastElement->Prev));
flag = 1;
continue;
}
else
{
if (flag)
Ring_DeleteElement(&(NastElement->Prev));
flag = 0;
}
} while((NastElement != *s) && NastElement);
if (flag && NastElement)
Ring_DeleteElement(&(NastElement->Prev));
*s = NastElement;
}