Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2014, 07:48   #1
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию Двусвязный список. Не работает функция удаления

Здравствуйте. Написал программу для работы с двусвязным списком.
Не работает функция удаления книг заданного автора(Remove).
Не могу понять в чем ошибка. Помогите, пожалуйста, разобраться.
Nickolay0512 вне форума Ответить с цитированием
Старый 29.08.2014, 07:49   #2
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию

Вот мой код:
Код:
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
//объявление структуры
typedef struct _Book
{
    char Name[20];
    char Author[20];
    int Year;
} Book;
Book ReadBook()
{
    Book Item;
    int res;
    char  s[10];
    printf("Enter title of the book:    ");
    scanf("%s", Item.Name);
    printf("Enter author of the book:         ");
    scanf("%s", Item.Author);
    printf("Enter year of Publication:  ");
    while (1)
    {
        res = scanf("%d", &Item.Year);
        fflush(stdin);
        if (res == 1) break;
        else printf("%s", "Invalid input. Try again.\n");
    }
    return Item;
}
void PrintBook(Book Item)
{
    printf("Title : %s\n", Item.Name);
    printf("Author: %s\n", Item.Author);
    printf("Year: %d\n", Item.Year);
    printf("----------------------------\n");
}
typedef struct _BookListItem
{
    Book Individual;
    struct _BookListItem* Next;
    struct _BookListItem* Prev;
} BookListItem;
void Add(Book data, BookListItem** ListTail, BookListItem** ListHead, int i)
{
    BookListItem *NEW = (BookListItem*)malloc(sizeof(BookListItem));
    NEW->Individual = data;
    NEW->Next = NULL;
    if (i == 0)
    {
        NEW->Prev = NULL;
        (*ListHead) = NEW;
        (*ListTail) = (*ListHead);
    }
    else
        if (i == 1)
        {
        (*ListHead)->Next = NEW;
        NEW->Prev = (*ListHead);
        (*ListTail) = NEW;
 
        }
        else
        {
            (*ListTail)->Next = NEW;
            NEW->Prev = (*ListTail);
            (*ListTail) = NEW;
        }
}
void Show(BookListItem **ListHead)
{
    BookListItem *temp = *ListHead;
    while (temp)
    {
        PrintBook(temp->Individual);
        temp = temp->Next;
    }
    printf("\n");
    return;
}
int Remove(BookListItem **ListTail, BookListItem **ListHead, char data[20], int i)
{
    BookListItem *currentItem1 = *ListHead;
    BookListItem *currentItem2 = *ListTail;
    int j, k = 0, f;
    char *s;
    for (j = 0; j<i; j++)
    {
        s = currentItem1->Individual.Author;
        if (strcmp(data, s)==0) //если есть совпадение
        {
            k++;
            if ((currentItem1->Prev == NULL) && (currentItem1->Next = NULL))//если элемент единственный
            {
                free(currentItem1);
                break;
            }
            if ((currentItem1 != (*ListHead)) && (currentItem1 != (*ListTail)))// если элемент в середине
            {
                currentItem1->Prev->Next = currentItem1->Next;
                currentItem1->Next->Prev = currentItem1->Prev; 
            }
            else
            {
                if (currentItem1 == (*ListHead)) 
                {
                    currentItem1->Next->Prev = NULL;
                    (*ListHead) = currentItem1->Next; 
                }
                if (currentItem1 == (*ListTail)) 
                {
                    currentItem1->Prev->Next = NULL;
                    (*ListTail) = currentItem1->Prev; 
                }
            }
        }
        currentItem1 = currentItem1->Next;
    }
    return k;
}
int main()
{
    int i = 0, n = 100;
    Book Individual;
    BookListItem *ListHead = (BookListItem*)malloc(sizeof(BookListItem));
    ListHead->Prev = NULL;
    BookListItem *ListTail = (BookListItem*)malloc(sizeof(BookListItem));
    ListTail->Next = NULL;
    while (n != 5)
    {
        printf("::::::::::::::Main Menu:::::::::::::\n");
        printf("1: Creat a list\n");
        printf("2: Show a list\n");
        printf("3: Add an element to the end of the list\n");
        printf("4: Change list\n");
        printf("5: Exit\n");
        printf("Enter number: ");
        scanf("%d", &n);
        system("cls");
        switch (n)
        {
        case 1:
        {
            int count = 0, j;
            printf("Enter the count of elements:\n");
            scanf("%d", &count);
            for (j = 1; j <= count; j++)
            {
                Individual = ReadBook();//считываем данные 
                Add(Individual, &ListTail, &ListHead, i);//добавляем данные в список
                i++;//увеличиваем количество элементов
            }
            break;
        }
        case 2://печать списка
        {
            if (i == 0)
            {
                printf("Error! List is empty!\n");
            }
            else
            {
                Show(&ListHead);
            }
            break;
        }
        case 4:
        {
            char data[20];
            int k;
            printf("Enter the author:");
            scanf("%s", data);
            k = Remove(&ListTail, &ListHead, data, i);
            if (k == 0) printf("This book is not in the list\n");
            i = i - k;
        }
        }
    }
    getchar();
    return 0;
 
}
Nickolay0512 вне форума Ответить с цитированием
Старый 29.08.2014, 08:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for (j = 0; j<i; j++)
Что это?
Рекомендую к рассмотрению: http://www.programmersforum.ru/showp...8&postcount=25
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2014, 08:03   #4
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию

цикл, чтобы пройти по всему списку
Nickolay0512 вне форума Ответить с цитированием
Старый 29.08.2014, 08:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По списку нужен не иттерационный цикл а цикл с условием )
Короче не правильно в корне у тебя написано.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2014, 08:20   #6
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию

Поменял на цикл с условием. Такая же проблема. Удаляется только если элемент(ы) в середине находится...
Nickolay0512 вне форума Ответить с цитированием
Старый 29.08.2014, 08:28   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet
По списку нужен не иттерационный цикл а цикл с условием )
точно!

Тем более, что в процедуре Show() как раз правильный цикл прохода по всему списку и представлен...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.08.2014, 08:33   #8
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию

Разобрался. Проблема была в условии. Вместо == было написано = )
Nickolay0512 вне форума Ответить с цитированием
Старый 29.08.2014, 08:37   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Проблема была в условии.
Внезапно О_о...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2014, 08:51   #10
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию

Теперь возник вопрос. Где в функции удаления написать free?
Nickolay0512 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список mazzahaker Помощь студентам 7 05.04.2012 08:58
Двусвязный список narcot Visual C++ 13 28.05.2011 21:12
Двусвязный список Work Group Паскаль, Turbo Pascal, PascalABC.NET 12 13.07.2010 01:44
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58
Двусвязный список kruserg Паскаль, Turbo Pascal, PascalABC.NET 1 28.04.2009 10:37