#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;
}
Удаление элемента из динамического списка
Программа создает динамический список, но не удаляет элемент. Подскажите, пожалуйста, в чем причина. :):):)
#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();
}
Цитата: 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;
}
В функцию неплохо бы передавать этот самый номер элемента Е. Или хоть обозначить его статически в самой функции
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;
}
Цитата: Rost
В функцию неплохо бы передавать этот самый номер элемента Е. Или хоть обозначить его статически в самой функции
Я думаю имелось ввиду void deleten(int num). В таком случае описание num в программе ненужно. А функцию вызывать, например так: deleten(5).
Еще я бы ВАм посоветовал head объявить в функции main().
А потом передавать его и возвращать из каждой функции. Если хотите такой пример я Вам приведу?
Цитата: s-ilent
Я думаю имелось ввиду void deleten(int num). В таком случае описание num в программе ненужно. А функцию вызывать, например так: deleten(5).
Да это и имел ввиду, в терминах я не силен просто:)) и автору не помешало бы проверять указатели на null а то если будет указан номер элемента больший чем количество элементов в списке то тоже ошибки поплывут.
Уважаемый s-ilent,приведите, пожалуйста Ваш пример.
Код:
И еще одно. Я так и не понял для чего Вы использовали конструкцию switch, но оставил ее, вдруг она необходима. (В Вашем случае проще было бы использовать if). И нажатие клавиши Esc не проверяется с использованием cin>>, поэтому я заменил ее на Q. Будут вопросы спрашивайте. А так все работает.
И еще я не совсем понял зачем Вы делаете ввод значения, после которого необходимо удалить символ, если по заданию он у Вас константа и равен E. Но я также не стал убирать его, может он тоже Вам нужен. Просто вводите там E(для удаления) или Q(для выхода).
Спасибо большое! Интересно работает. А по поводу switch и константы: не хочется урезать возможности даже такой программы. Ведь в реальности завтра понадобится удалять элемент после другой буквы или не удалять, а добавлять. А так вроде и в русле задания, и применительно к реальной жизни легче программу приспособить. Хотя в условиях всеобщего тестирования мои взгляды, наверное, не актуальны.Ещё раз большое спасибо!