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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2013, 20:00   #1
Pomogi
 
Регистрация: 26.12.2012
Сообщений: 8
По умолчанию объясните функцию удаления

есть код:
Код:
#include <iostream>
using namespace std;
struct node{
		double a;
		double b;
		node *next;};
	node *head= NULL;
	node *p, *tail;
void del(int n){
		node *d;
		d=new node;
		p=head;
		for(int i=1;i<n;i++){p=p->next;
			d=p->next;}
			p->next=d->next;
		delete d;};
вопрос зачем для удаления елемента создают новый элемент структуры?
Код:
node *d;
d=new node;
p=head;
и если можно напишите коментарии к сточкам пожалуйста.

Последний раз редактировалось Pomogi; 06.07.2013 в 20:02.
Pomogi вне форума Ответить с цитированием
Старый 07.07.2013, 05:27   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Какой задача была изначально? Возможно, создание элемента структуры ошибка, так как указатель меняет адрес и память не освобождается (происходит утечка памяти)

Не делается проверки next на 0 что будет вызывать падение программы, если в списке только один элемент.

Если n <= 1 то список становится несвязным, и теряется все после head. d->next указывает на деревню дедушке, то есть в никуда.

Если n = 2 то выполнение будет состоять из следующих операторов:
d=new node;
p=head;
p=p->next; // переход на следующий элемент списка
d=p->next;// переход на следующий элемент списка
p->next=d->next;// переход на следующий элемент списка
delete d;

head - это, наверное, указатель на начало списка. Если это не так, то поведение функции непредсказуемо, и неизвестен результат выполнения операторов.

Будем предполагать, что head все-таки указывает на начало списка и в списке не один элемент. Так как если элемент один, произойдет падение программы на операторе p=p->next; так как следующего элемента попросту нет.

Если в списке 2 элемента, то у нового p нет последующего элемента, и снова произойдет падение программы на операторе d=p->next;. При этом то на что указывает d при создании нового элемент списка d=new node теоряется в пустоту и происходит утечка памяти

Если в списке 3 элемента, то у нового d нет последующего элемента, и падление программы произойдет на операторе p->next=d->next.

Если в списке 4 и более элементов то выполнение куска кода будет успешным.
p=head; // p указывает на первый элемент списка
p=p->next; // p указывает на второй элемент списка
d=p->next; // d указывает на третий элемент списка
p->next=d->next; // p->next указывает на четвертый элемент списка
delete d; // удаляется третий элемент списка

Таким образом, в случае n = 2 программа может удалить третий элемент списка

Если n = 3 то выполнение будет состоять из следующих операторов:

node *d;
d=new node;
p=head; // p указывает на первый элемент списка
p=p->next; // p указывает на второй элемент списка
d=p->next; // d указывает на третий элемент списка
p=p->next; // p указывает на третий элемент списка
d=p->next; // d указывает на четвертый элемент списка
p->next=d->next; // p->next указывает на пятый элемент списка
delete d; // удаляется четвертый элемент списка
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 07.07.2013, 12:42   #3
Pomogi
 
Регистрация: 26.12.2012
Сообщений: 8
По умолчанию

вот вся программа:
Код:
#include <iostream>
using namespace std;
struct node{
		double a;
		double b;
		node *next;};
	node *head= NULL;
	node *p, *tail;
void add(int n){
		int i;
		node *v;
		v=new node;
		cout<<"Vvedite pervoe drobnoe chislo :";
		cin>>v->a;
		cout<<"Vvedite vtoroe drobnoe chislo :";
		cin>>v->b;
		p=head;
		if(n==0){
			v->next=head;
			head=v;}
		else{
			for(i=1;i<n;i++) p=p->next;
				v->next=p->next;
				p->next=v;}};
	void del(int n){
		node *d;
		d=new node;
		p=head;
		for(int i=1;i<n;i++){p=p->next;
			d=p->next;}
			p->next=d->next;
		delete d;};
int main(){
	int i,n=0;
	double s1=0,s2=0,sa1,sa2,sa;
	char z;
	if(head==NULL){
		head=new node;
		cout<<"Vvedite pervoe drobnoe chislo :";
		cin>>head->a;
		cout<<"Vvedite vtoroe drobnoe chislo :";
		cin>>head->b;
		head->next=NULL;
		tail=head;}
	double s=0,pr=1;
	cout<<"Prodoljit?(y-da;n-net): ";
	cin>>z;
	if(z!='n'){
	while(z!='n'){
		p=new node;
		cout<<"Vvedite pervoe drobnoe chislo :";
		cin>>p->a;
		cout<<"Vvedite vtoroe drobnoe chislo :";
		cin>>p->b;
		tail->next=p;
		p->next=NULL;
		tail=p;
		cout<<"Prodoljit?(y-da;n-net): ";
	    cin>>z;
		n++;}}
	cout<<"Udalit element?(y/n)";
	char f;
	cin>>f;
	if(f=='y'){
		int y;
		cout<<"Vvedite element kotoriy hotite udalit";
		cin>>y;
		if(y<=n){del(y);}
		if(y<0){
			cout<<"Takogo elementa ne suchestvuet"<<endl;}
		if (y>n)
		{cout<<"Takogo elementa ne suchestvuet"<<endl;}}
	cout<<"Hotite dobavit element? (y/n)";
	cin>>f;
	if(f=='y'){
		int y;
		cout<<"Vvedite element kotoriy hotite dobavit";
		cin>>y;
		if(y<=n){add(y);}
		if(y<0){
			cout<<"Takogo elementa ne suchestvuet"<<endl;}
		if (y>n)
		{cout<<"Takogo elementa ne suchestvuet"<<endl;}}
	p=head;
	for(i=0;i<=n;i++){
		s1=p->a+s1;
		s2=p->b+s2;
		p=p->next;}
	sa1=s1/(n+1);
	sa2=s2/(n+1);
	sa=(s1+s2)/(2*(n+1));
	cout<<"Srednee arifmeticheskoe poley first ="<<sa1<<endl;
	cout<<"Srednee arifmeticheskoe poley second ="<<sa2<<endl;
	cout<<"Srednee arifmeticheskoe vseh poley ="<<sa<<endl;
	p=head;
	for(i=0;i<=n;i++){
		s=s+p->a;
		pr=pr*p->b;
	p=p->next;}
	cout<<"Suma poley first: "<<s<<endl;
	cout<<"Proizvidenie poley second: "<<pr<<endl;
	return 0;}
при удалении элемета программа дает сбой. но если удаленный элемент заменить другим то работает.
Pomogi вне форума Ответить с цитированием
Старый 07.07.2013, 14:41   #4
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

После del(y); нужно уменьшить n на единицу оператором n--, так как далее в цикле for считается по старому и на p=p->next происходит падение.

Функцию del можно переписать в следующем виде:
Код:
void del(int n)
{
 if (n < 1)
  return;

 int i;
 node* d;
 node* d1;
 if (n == 1)
 {
   d = head;
   if (head->next != NULL)
    head = head->next;
   delete d;
 }
 else
 {
   i = 1;
   d = head; // 1
   if (d->next != NULL)
    d1 = d->next; //2
   for( ; i < n-1 ; i++)
   {
     d = d->next;
     if (d->next != NULL)
      d1 = d->next;
   }
   if (d1->next != NULL)
    d->next = d1->next;
   delete d1;
 }
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ написать функцию удаления последнего элемента из списка scrinn Помощь студентам 0 04.06.2012 23:56
Объясните функцию c_str PotatoCaptain Общие вопросы C/C++ 2 21.12.2011 14:44
Описать функцию нахождения расстояния между 2-мя точками на плоскости, заданными своими координатами, и функцию .... zzz6 Помощь студентам 2 06.07.2011 08:24
Сумма ряда с точностью Е=10-4, Сформировать обномерный массив, написать функцию для удаления строки... Dasha M Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2011 18:33