آزادسازی حافظه در لینک لیست ها - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

آزادسازی حافظه در لینک لیست ها

0 امتیاز

با سلام.در ادامه سوالی که در مورد لینک لیست ها پرسیدم یه سوال دیگه داشتم.با عرض شرمندگی! در این برنامه گفته شده که به ازای ورودی 6 باید یه تابع بازگشتی داشته باشیم که حافظه های گرفته شده برای هریک از لینک لیست ها رو آزاد سازی کنه.من واقعا نمی فهمم منظور سوال چیه.من متغیر های مثل inf* , *p , *q ,... رو در تابع هام استفاده کردم.حالا چجوری این ها رو برای آزادسازی یا همون delete کردن ببرم تو یه تابع بازگشتی.اصلا چجوری میشه آزادسازی رو بازگشتی نوشت.با سپاس فروان

#include <iostream>
using namespace std;
int conter_comp=0;
int conter_mach=0;
int conter=0;
struct student
{
	char name[15];
	char family[15];
	char college[10];
	float ave;
	int ID;
	student *next;
	student *prev;
};
student *head=0;
void _input(char name[15],char family[15],int ID ,float ave,char college[4])
{
	student *p,*q;
	p=q=head;
	int flag=0;
	student *new_student=new student;
	strcpy(new_student->name,name);
	strcpy(new_student->family,family);
	new_student->ID=ID;
	new_student->ave=ave;
	strcpy(new_student->college,college);
	if(!head)
	{
		head=new_student;
		new_student->next=0;
		//new_student->prev=head;
		
	}
	else
	{
	
	while(p && p->ave > ave)
	{
	  flag=1;
	  q=p;
	  p=p->next;
	}
	if(flag==0)
	{
		head=new_student;
		new_student->next=p;
		p->prev=new_student;
	}
	else
	{
	//p->prev=new_student;
	q->next=new_student;
	new_student->prev=q;
	new_student->next=p;
	}
  }
}
bool print_n_college(char depa[4],int number)
{
	student *inf;
	inf=head;
	if((strcmp(depa,"COMP")==0) && (number>conter_comp) )
	{
	
		cout<<"ERR"<<endl;
		return false;
	 
	}
	else if((strcmp(depa,"MACH")==0) && (number>conter_comp))
	{
	
		cout<<"ERR"<<endl;
		return false;
	 
	}
	else
	{
		int k=0;
		for(;inf;inf=inf->next)
		{
			if(strcmp(inf->college,depa)==0)
			{
				k++;
			}
			if(k==number)
			{
				cout<<inf->name<<' '<<inf->family<<' '<<inf->ID<<' '<<inf->ave<<' '<<inf->college<<endl;
				break;
			}
		}
		return true;
	}
}
bool print_n_univ(int N)
{
	student *inf;
	inf=head;
	if(N>conter)
	{
		cout<<"ERR"<<endl;
		return false;
	}
	for(;inf;inf=inf->next)
		{
			
				for(int i=1;i<N;i++)
				{
					inf=inf->next;
				}
				cout<<inf->name<<' '<<inf->family<<' '<<inf->ID<<' '<<inf->ave<<' '<<inf->college<<endl;
				break;
		}
	return true;
}
bool find(int id)
{
	student *p;
	p=head;
	while(p)
	{
		if(p->ID==id)
			return true;
		p=p->next;
	}
	return false;
}
bool deport(int id)
{
	student *p,*q;
    p=q=head;
	int flag=0;
	if (find(id)==false)
	{
		cout<<"NOTFOUND"<<endl;
		return false;
	}
	else
	{
	while(p && p->ID!=id)
	{
		flag=1;
		q=p;
		p=p->next;
	}
	if(flag==0)
  {
	 head=p->next;

  }
  else
  {
    q->next=p->next;
  }
 delete p;
 cout<<"DONE"<<endl;
 return true;
	}
}
void show(char depa[4],int x)
{
	student *inf,*p;
	p=inf=head;
	if(x==1)
	{
	for(;inf;inf=inf->next)
		{
			if(strcmp(inf->college,depa)==0)
			{
            cout<<inf->name<<' '<<inf->family<<' '<<inf->ID<<' '<<inf->ave<<' '<<inf->college<<endl;
				
			}
		}
	}
	else
	{
		for(;inf;inf=inf->next)
		{
			p=inf;
		}
		for(;p;p=p->prev)
		{
			if(strcmp(p->college,depa)==0)
			{
            cout<<p->name<<' '<<p->family<<' '<<p->ID<<' '<<p->ave<<' '<<p->college<<endl;
				
			}
		}
	}
}
/*void release()
{
}*/
int main()
{
	char name[15];
	char family[15];
	char college[10];
	float ave;
	int ID;
	int in=0;
	while(in!=6)
	{
		cin>>in;
		if(in==1)
		{
			cin>>name;
			cin>>family;
			cin>>ID;
			cin>>ave;
			cin>>college;
			if(strcmp(college,"COMP")==0)
				conter_comp++;
			if(strcmp(college,"MACH")==0)
				conter_mach++;
			conter++;
			_input(name,family,ID,ave,college);
		}
		if(in==2)
		{
		char dep[4];
		int number;
		cin>>dep;
		cin>>number;
		print_n_college(dep,number);
		
		}
		if(in==3)
		{
		     int n=0;
		      cin>>n;
			  print_n_univ(n);
		}
		 if(in==4)
		{
			int id=0;
			cin>>id;
			deport(id);
		}
		if(in==5)
		{
			char dep[4];
		    int number;
		    cin>>dep;
		    cin>>number;
			show(dep,number);
		}
		/*if(in==6)
		{
		  
		}*/
	}
	return 0;
}</span>

 

سوال شده بهمن 24, 1392  بوسیله ی maryam (امتیاز 338)   12 33 44
دوباره تگ گذاری شد فروردین 11, 1393 بوسیله ی BlueBlade

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام

برای پاک کردن به این شکل عمل کنید  :

void remove_recursive(Node *node)
{   
    if(node==NULL)
        return;

    remove_recursive(node->next);

    delete node;
}

نحوه صدا زدن از main :

remove_recursive(head);

 

پاسخ داده شده بهمن 24, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد بهمن 25, 1392 بوسیله ی مصطفی ساتکی
thank you.GOOD LUCK
...