Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление элемента из динамического списка

47K
25 апреля 2009 года
Sira1962
5 / / 25.04.2009
Задание: Из непустого динамического списка удалить элемент, следующий за элементом со значением Е.
Программа создает динамический список, но не удаляет элемент. Подскажите, пожалуйста, в чем причина. :):):)

#include <iostream.h>
struct LIST // Структура динамического списка
{
char dann;
LIST *next;
};
LIST *head=NULL;
LIST *rear=NULL;

void make (int a) //Формирование списка
{
LIST *ptr;
ptr=new LIST;
if (!head) head=ptr;
else rear->next=ptr;
ptr->dann=a;
rear=ptr;
rear->next=NULL;
}

void print(void) //Вывод на экран элементов списка
{
LIST *ptr=head;
while (ptr)
{
cout<<ptr->dann<<" ";
ptr=ptr->next;
}
cout<<endl;
}

void deleten() //удаление элемента, следующего после определенным элементом
{
LIST *ptr=head;
LIST *temp;
int i=0;
int num;

while (i++!=num)
ptr=ptr->next;
temp=ptr->next; //Указатель temp указывает на удаляемый элемент
ptr->next=temp->next;
delete temp;
}

int main (struct LIST)
{int ptr;
int temp;
int n,i;
char b;
char key;
int num;
cout<<"Enter number of elements:"<<endl;
cin>>n;
cout<<"Enter elements:"<<endl;
for (i=0;i<n;i++)
{
cin>>b;
make(b);
}
cout<<"Entered list: ";
print();
cout<<"Enter num:"<<endl;
cin>>key;

switch (key)
{
case 'E':
deleten ();
break;
case 27: return 0;
}
cout<<"Enter List after deleting element nexted for element E: ";
print();
}
19K
25 апреля 2009 года
Rost
45 / / 05.07.2007
Цитата: Sira1962

void deleten() //удаление элемента, следующего после определенным элементом
{
LIST *ptr=head;
LIST *temp;
int i=0;
[COLOR="Red"]int num;[/COLOR] Это значение из космоса берется? ;)

while (i++!=num)
ptr=ptr->next;
temp=ptr->next; //Указатель temp указывает на удаляемый элемент
ptr->next=temp->next;
delete temp;
}



В функцию неплохо бы передавать этот самый номер элемента Е. Или хоть обозначить его статически в самой функции

47K
26 апреля 2009 года
Sira1962
5 / / 25.04.2009
Обозначение элемента статически в самой функции это так или имеется в виду что-то другое?

void deleten()
{
LIST *ptr=head;
LIST *temp;
char key;
int i=0;
int num;
char a;
LIST *E;
num=key;
while (i++!=num)
ptr=ptr->next;
temp=ptr->next;
temp=E;
ptr->next=temp->next;
delete temp;

}
18K
26 апреля 2009 года
s-ilent
58 / / 30.09.2008
Цитата: Rost
В функцию неплохо бы передавать этот самый номер элемента Е. Или хоть обозначить его статически в самой функции



Я думаю имелось ввиду void deleten(int num). В таком случае описание num в программе ненужно. А функцию вызывать, например так: deleten(5).

Еще я бы ВАм посоветовал head объявить в функции main().
А потом передавать его и возвращать из каждой функции. Если хотите такой пример я Вам приведу?

19K
26 апреля 2009 года
Rost
45 / / 05.07.2007
Цитата: s-ilent
Я думаю имелось ввиду void deleten(int num). В таком случае описание num в программе ненужно. А функцию вызывать, например так: deleten(5).



Да это и имел ввиду, в терминах я не силен просто:)) и автору не помешало бы проверять указатели на null а то если будет указан номер элемента больший чем количество элементов в списке то тоже ошибки поплывут.

47K
27 апреля 2009 года
Sira1962
5 / / 25.04.2009
Уважаемый s-ilent,приведите, пожалуйста Ваш пример.
18K
27 апреля 2009 года
s-ilent
58 / / 30.09.2008
Пожалуйста.

Код:
#include <iostream.h>
#include <stdlib.h>

typedef struct LIST // Структура динамического списка
{
char dann;
LIST *next;
}_LIST;

_LIST *deleten(_LIST *_head, char key);
void print(_LIST *_head);
_LIST *make(_LIST *_head, char b);

int main() {
_LIST   *_head = 0;
int     n,i;
char    b;
char    key;

cout << "Enter number of elements: ";
cin >> n;
cout << endl << "Enter elements: ";
cout << endl;

    for(i = 0; i < n; i++)
    {
        cin >> b;
        _head = make(_head, b);
    }

cout << "Entered list: ";
print(_head);


cout << "Enter key (or Q to exit): ";
cin >> key;
cout << endl;

    switch(key)
    {
        case 'E':
            _head = deleten(_head, key);
            cout << "Enter List after deleting element nexted for element " << key << ": ";
            print(_head);  
        break;
        case 'Q': return 0;
        default:
            cout << "No elements for deleting. You did not input \"E\" key.";  
        break;
    }

return 0;
}

_LIST *make(_LIST *_head, char b) //Формирование списка
{
_LIST *ptr;

if(!_head) {
    ptr = (_LIST*)calloc(1, sizeof(_LIST));
    ptr->dann = b;
    return ptr;
}

_head->next = make(_head->next, b);

return _head;
}

void print(_LIST *_head) //Вывод на экран элементов списка
{
LIST *ptr;

if(!_head) return;
for(ptr = _head; ptr; ptr = ptr->next) cout << ptr->dann << " ";
cout<<endl;

}

_LIST *deleten(_LIST *_head, char key) //удаление элемента, следующего после определенным элементом
{
_LIST *ptr;
_LIST *tmp;

if(!_head) return _head;

    for(ptr = _head; ptr; ptr = ptr->next) {
        if((ptr->dann == key) && ptr->next) {
            if(ptr == _head) {
                tmp = ptr;
                ptr = ptr->next;
                tmp->next = ptr->next;
                free(ptr);
                ptr = tmp;
            } else {
                tmp = tmp->next;
                ptr = ptr->next;
                tmp->next = ptr->next;
                free(ptr);
                ptr = tmp;
            }
        }

        tmp = ptr;
    }

return _head;
}


И еще одно. Я так и не понял для чего Вы использовали конструкцию switch, но оставил ее, вдруг она необходима. (В Вашем случае проще было бы использовать if). И нажатие клавиши Esc не проверяется с использованием cin>>, поэтому я заменил ее на Q. Будут вопросы спрашивайте. А так все работает.
И еще я не совсем понял зачем Вы делаете ввод значения, после которого необходимо удалить символ, если по заданию он у Вас константа и равен E. Но я также не стал убирать его, может он тоже Вам нужен. Просто вводите там E(для удаления) или Q(для выхода).
47K
28 апреля 2009 года
Sira1962
5 / / 25.04.2009
Спасибо большое! Интересно работает. А по поводу switch и константы: не хочется урезать возможности даже такой программы. Ведь в реальности завтра понадобится удалять элемент после другой буквы или не удалять, а добавлять. А так вроде и в русле задания, и применительно к реальной жизни легче программу приспособить. Хотя в условиях всеобщего тестирования мои взгляды, наверное, не актуальны.Ещё раз большое спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог