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

Тема в разделе "C/C++/C#", создана пользователем koly, 10 июн 2014.

  1. koly

    koly New Member

    Регистрация:
    10 июн 2014
    Сообщения:
    1
    Симпатии:
    0
    помогите пожалуйста!!!Дана двусвязный список и нужно создать его и нужно найти в нём убывающую последовательность и удалить её,вот в чём проблема, программа сама есть ,все функции есть и всё запускается, но не хочет работать функция удаления убывающей последовательности...
    #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;
    }
     
  2. ixoyz

    ixoyz Member

    Регистрация:
    12 май 2012
    Сообщения:
    16
    Симпатии:
    0
    Ошибки:
    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;
    ?
     
Загрузка...
Похожие Темы - Двусвязный Список
  1. b0006
    Ответов:
    0
    Просмотров:
    1.053
  2. gx6060
    Ответов:
    2
    Просмотров:
    435
  3. gx6060
    Ответов:
    6
    Просмотров:
    577
  4. Shandrik
    Ответов:
    6
    Просмотров:
    813
  5. anna
    Ответов:
    8
    Просмотров:
    816

Поделиться этой страницей