• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Двусвязный Список

  • Автор темы koly
  • Дата начала
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;
}
 
I

ixoyz

Ошибки:
1. void add (ring **s) синтаксическая ошибка
C++:
...
if (!*s) 
{
(*s)->Prev = s1;
(*s)->Next = s1;
(*s) = s1;
}
...

2. void see (ring *s) дважды сделана проверка на пустое кольцо, перед вызовом функции и внутри функции. Зачем?

3. void Ring_DeleteElement( ring **s)
C++:
 free(s1);

4. main() - не понял, зачем?
C++:
int *Next = NULL,*Prev = NULL;

5. Почему в структуре
C++:
int inf[N];
, а не
C++:
int inf;
?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!