如何在树的任何节点中添加链接列表? [英] How to add a link list in any node of a tree?

查看:106
本文介绍了如何在树的任何节点中添加链接列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,有一棵带有根节点的树,我想在一个节点上添加一个链接列表;



/\
/\
节点1. (在node2上添加链接列表)

eg.there is a tree with a root node and I want to add a link list on a node;

root

/ \
/ \
node1 node2-> (adding linked list on node2)

推荐答案

您似乎已经实现了树形结构,显然您也具有了链接列表结构.因此,您要做的就是将树节点的数据设置为指向链表结构的实例.这样做到底是什么问题?
You seem to have a tree structure implemented, and apparently you also have a linked list structure. So all you need to do is to set the tree node''s data to point to an instance of the linked list structure. What exactly is the problem in doing this?


这里是解决您问题的简单实现.

Here is a simple implementation solving your problem.

#include <list>
class Node;
typedef std::list<Node> node_list;
class NodeData
{
private:
	unsigned referenceCount_;
	node_list children_;
	
public:
	NodeData()
		: referenceCount_(1),
		  children_(0)
	{
	}
	unsigned add_reference()
	{
		referenceCount_++;
		return referenceCount_;
	}
	unsigned remove_reference()
	{
		referenceCount_--;
		if(referenceCount_ == 0)
		{
			delete this;
		}
		return referenceCount_;
	}

	node_list& children()
	{
		return children_;
	}
	const node_list& children() const
	{
		return children_;
	}
}

class Node
{
private:
	NodeData* data_;	
public:
	Node()
	{
		data_ = new NodeData();
	}
	Node(const Node& other)
	{
		data_ = other.data_;
		if(data_)
		{
			data_->add_reference();
		}
	}

	virtual ~Node()
	{
		if(data_)
		{
			data_->remove_reference();	
		}
	}
    Node& operator = (const Node& other)
	{
		if(other.data_ != data_)
		{
			if(data_)
			{
				data_->remove_reference();
			}
			data_ = other.data_;
			if(data_)
			{
				data_->add_reference();
			}
		}
	}
	
	node_list& children()
	{
		return data_->children();
	}
	const node_list& children() const
	{
		return data_->children();
	}
}


void main()
{
    Node rootNode;
    Node childNode1;
    Node childNode2;
    Node childNode2_1;
    rootNode.children().push_back(childNode1);
    rootNode.children().push_back(childNode2);
    childNode2.children().push_back(childNode2_1);
}



问候
Espen Harlinn



Regards
Espen Harlinn


我认为这可以解决您的问题:-D
I think this will solve your problem :-D
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<process.h>
#include<fstream.h>

class File{
	char* FileName;
	char* Extension;
	char* Attributes;

public:

	File(){
	
	FileName=NULL;
	Extension=NULL;
	Attributes="false";

	}
	
	void setattribute(char *a){
	Attributes=new char[strlen(a)+1];
	strcpy(Attributes,a);
	}
	void setfilename(char * n){
	FileName=new char[strlen(n)+1];
	strcpy(FileName,n);
	}
	
	void setextension(char *e){
	Extension=new char[strlen(e)+1];
	strcpy(Extension,e);
	}
	
	char *getattribute(){
	return Attributes;
	}
	
	char *getfilename(){
	return FileName;
	}


	
	char *getextension(){
	return Extension;
	}
};

class Folder{
	char* FolderName;
	char* Attributes;
	File *PointertoFile;
	Folder *PointertoFolder;
	Folder *PointertoSubFolder;

public:

	Folder(){
	
	FolderName=NULL;
	Attributes="false";
	PointertoFile=NULL;
	PointertoFolder=NULL;
	PointertoSubFolder=NULL;
	}

	void setfoldername(char * n){
	FolderName=new char[strlen(n)+1];
	strcpy(FolderName,n);
	}
	
	void setattribute(char *a){
	Attributes=new char[strlen(a)+1];
	strcpy(Attributes,a);
	}

    void setPointertoFile(File* p){
	PointertoFile=p;}

	void setPointertoFolder(Folder* p){
	PointertoFolder=p;}

	void setPointertoSubFolder(Folder* p){
	PointertoSubFolder=p;}


	char *getfoldername(){
	return FolderName;
	}

	char *getattribute(){
	return Attributes;
	}
	
    File* getPointertoFile(){
	return PointertoFile;}

	Folder* getPointertoFolder(){
	return PointertoFolder;}

	Folder* getPointertoSubFolder(){
	return PointertoSubFolder;}
};



class Drive{
char *DriveName;
Folder *PointertoFolder;
	
public:
	Drive(){
	DriveName=NULL;
	PointertoFolder=NULL;
	}

	void setDriveName(char* n){
	DriveName=new char[strlen(n)+1];
	strcpy(DriveName,n);
	}
	
	Folder* getPointertoFolder(){
	return PointertoFolder;}

	void setPointertoFolder(Folder* p){
	PointertoFolder=p;}


	char* getDriveName(){
	return DriveName;}


};



class FileSystem{
Drive *root;
Folder *curr;

public:
	
	FileSystem(){
	
	root=new Drive();
	root->setDriveName("Drive C");
	curr=NULL;
	}
/////////////////////////////////////
	void createFolder(){
	char n[30];
	cout<<"Enter FolderName "<<endl;
	gets(n);

	Folder *f=new Folder();
	f->setfoldername(n);
	
	if(root->getPointertoFolder()==NULL)root->setPointertoFolder(f);
	else{ 
		int n=0;
		cout<<"Enter 1 For Create Folder in Current Folder\nEnter 2 for Create Subfolder of Current Folder "<<endl;
		cin>>n;
		if(n==1)curr->setPointertoFolder(f);
		else if(n==2) curr->setPointertoSubFolder(f);
	}
	curr=f;
	
	}
//////////////////////////////////////
	void createFile(){
	char n[30],e[30];
	cout<<"Enter FileName then Extension"<<endl;
	gets(n);
	gets(e);
	
	File *f=new File();
	f->setfilename(n);
	f->setextension(e);

	if(root->getPointertoFolder()==NULL)cout<<"File Must Save In Some Folder"<<endl;
	else curr->setPointertoFile(f);
		

	
	}

////////////////////////////////////////

	void DisplayFolder(){
		
	
	if(root->getPointertoFolder()==NULL )cout<<"There Is No Folder OR File Exist"<<endl;
	
	else
		{
		Folder *temp=curr;
		viewall(temp);

		}	
	
	}

	void viewall(Folder *f){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			if(strcmp( temp->getattribute(),"false")==0 )cout<<"Folder :"<<temp->getfoldername()<<endl;
			File *temp2=temp->getPointertoFile();
				
			if(temp2!=NULL){cout<<"\nFile :"<<temp2->getfilename()<<endl;
				cout<<"Exe :"<<temp2->getextension()<<endl;
			}
			temp=temp->getPointertoFolder();}

	f=f->getPointertoSubFolder();
		viewall(f);		
		}
	
	}



//////////////////////////////////

	void NavigatetoFolder(char *name){

	if(root->getPointertoFolder()==NULL)cout<<"There Is No Folder and File Exist"<<endl;	
	else
		{
		int found=0;
		Folder *temp=root->getPointertoFolder();
		curr=navviewall(temp,name,found);
if(found==1)cout<<"Folder Navigated "<<endl;
else cout<<"Folder Doesnt Exist "<<endl;
		}	
	}

	Folder *navviewall(Folder *f,char* name,int &found){
		 if(f==NULL)return curr;
	else if(	strcmp(f->getfoldername(),name)==0){found=1;return f;}
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			if(	strcmp(temp->getfoldername(),name)==0){found=1;return temp;}
			temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		navviewall(f,name,found);}	
	
	}


//////////////////////////////////////	
	

	void SearchFolder(char *name){
	
	if(root->getPointertoFolder()==NULL)cout<<"There Is No Folder and File Exist"<<endl;	
	else
		{
		Folder *temp=root->getPointertoFolder();
		int found=0;
		fviewall(temp,name,found);
	if(found==0)cout<<"Folder Doesnt Exist "<<endl;	
	}	
	}


	void fviewall(Folder *f,char *name,int &found){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			if(strcmp(temp->getfoldername(),name)==0 && strcmp( temp->getattribute(),"false")==0 ){
				cout<<"\nFolder :"<<temp->getfoldername()<<endl;	found=1;	}
		temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		fviewall(f,name,found);}
	
	}	

/////////////////////////////////////////////////////////



	void SearchFile(char *name){
		
	
		Folder *temp=root->getPointertoFolder();
		int found=0;
		fileviewall(temp,name,found);
		if(found==0)cout<<"File Doesnt Exist "<<endl;	
			
	} 


	void fileviewall(Folder *f,char *name,int &found){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			File *temp2=temp->getPointertoFile();
		
			if(temp2!=NULL){if(strcmp(temp2->getfilename(),name)==0 && strcmp( temp2->getattribute(),"false")==0 ){
				cout<<"\nFile :"<<temp2->getfilename()<<endl;
				cout<<"Exe :"<<temp2->getextension()<<endl;
				found=1;
			}}
			
			temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		fileviewall(f,name,found);}
	
	}

/////////////////////////////////
	
	void DisplayAll(){
		
	if(root->getPointertoFolder()==NULL )cout<<"There Is No Folder OR File Exist"<<endl;
	
	else
		{
		cout<<root->getDriveName()<<endl;
		Folder *temp=root->getPointertoFolder();
		viewall(temp);

		}	
	}
////////////////////////////////

	void EditAttributes(){
		int n=0;
		char name[30];
	
	cout<<"Enter 1 for Folder Attribite Change\nEnter 2 for File Attribute Change"<<endl;
	cin>>n;

	

	if(n==1){
	cout<<"Enter Folder Name "<<endl;
	gets(name);
	editFolder(name);
	}
	
	else if(n==2){
	cout<<"Enter File Name "<<endl;
	gets(name);
	editFile(name);
	
	}
	
	}
	
	
/////////////////////////////////////////////////////	
	void editFolder(char *name){
	
	if(root->getPointertoFolder()==NULL)cout<<"There Is No Folder and File Exist"<<endl;	
	else
		{
		Folder *temp=root->getPointertoFolder();
		int found=0;
		eviewall(temp,name,found);
	if(found==0)cout<<"Folder Doesnt Exist "<<endl;	
	}	
	}


	void eviewall(Folder *f,char *name,int &found){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			if(strcmp(temp->getfoldername(),name)==0 && strcmp( temp->getattribute(),"false")==0 ){
				char a[30];
				cout<<"\nEnter New Attribute of This Folder (true\false):"<<endl;
				cin>>a;
				temp->setattribute(a);
				found=1;	}
		temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		eviewall(f,name,found);}
	
	}	
///////////////////////////////////////////////////////
void editFile(char *name){
		
	
		Folder *temp=root->getPointertoFolder();
		int found=0;
		efileviewall(temp,name,found);
		if(found==0)cout<<"File Doesnt Exist "<<endl;	
			
	} 


	void efileviewall(Folder *f,char *name,int &found){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			File *temp2=temp->getPointertoFile();
			if(temp2!=NULL){if(strcmp(temp2->getfilename(),name)==0 && strcmp( temp2->getattribute(),"false")==0 ){
				char a[30];
				cout<<"\nEnter New Attribute of This File (true\false):"<<endl;
				cin>>a;
				temp2->setattribute(a);
				found=1;
			}}
			
			temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		efileviewall(f,name,found);}
	
	}

/////////////////////////////////////////////////////////////


	void DeleteFolder(char *name){
	
	if(root->getPointertoFolder()==NULL)cout<<"There Is No Folder and File Exist"<<endl;
	
	else
		{
		
		Folder *temp2=root->getPointertoFolder();
		Folder *last=temp2;
	
			while(temp2!=NULL){
			if(strcmp(temp2->getfoldername(),name)==0 && (temp2==root->getPointertoFolder()) ){
				root->setPointertoFolder(temp2->getPointertoFolder());
				delete temp2;
				temp2=root->getPointertoFolder();
			}
			else {if( strcmp(temp2->getfoldername(),name)==0 ){
				last->setPointertoFolder(temp2->getPointertoFolder());
				delete temp2;
				temp2=last;
			}}

			last=temp2;
		temp2=temp2->getPointertoFolder();}

		}
	
	}



	void DeleteFile(char *name){
		
	
		Folder *temp=root->getPointertoFolder();
		int found=0;
		delfile(temp,name,found);
		if(found==0)cout<<"File Doesnt Exist "<<endl;	
			
	} 


	void delfile(Folder *f,char *name,int &found){
	if(f==NULL)return;
	else
		{ 
		Folder *temp=f;
	
		while(temp!=NULL){
			File *temp2=temp->getPointertoFile();
		
			if(temp2!=NULL){if(strcmp(temp2->getfilename(),name)==0  ){
			delete temp2;
			temp->setPointertoFile(NULL);
				found=1;
			}}
			
			temp=temp->getPointertoFolder();}

		f=f->getPointertoSubFolder();
		delfile(f,name,found);}
	
	}


};


void menu(FileSystem *&s){
int op;
char name[30];
cout<<"\nPress Number For Operation\n> 1. Create File\n> 2. Create Folder\n> 3. Navigate to Folder\n> 4. Search Folder\n> 5. Search File\n> 6. Display Folder\n> 7. Display All\n> 8. Delete Folder\n> 9. Delete File\n> 10. Set Attributes \n> 0. EXIT\n\n"<<endl;
cin>>op;
switch(op){

	case 1:{
s->createFile();
menu(s);
		break;}

		case 2:{
			s->createFolder();
			menu(s);
			break;}

			case 3:{
				cout<<"Enter Folder Name"<<endl;
				gets(name);
				s->NavigatetoFolder(name);
				menu(s);
				break;}

				case 4:{
				cout<<"Enter Folder Name"<<endl;
				gets(name);
					s->SearchFolder(name);
					menu(s);
					break;}

					case 5:{
				cout<<"Enter File Name"<<endl;
				gets(name);
						s->SearchFile(name);
					menu(s);
						break;}

						case 6:{
							s->DisplayFolder();
						menu(s);
							break;}

							case 7:{
								s->DisplayAll();
							menu(s);
								break;}
	
								case 8:{
								cout<<"Enter Folder Name"<<endl;
								gets(name);
									s->DeleteFolder(name);
									menu(s);
								break;}

								case 9:{
									cout<<"Enter File Name"<<endl;
									gets(name);
									s->DeleteFile(name);
									menu(s);
									   break;}
									
								case 10:{
									s->EditAttributes();
									menu(s);
									   break;}
									   
								case 0:{	
									fstream file;
									file.open("C:/FileSystem.txt",ios:: app );
									file.write((char *)&s,sizeof(FileSystem));
									file.close();
	
									exit(0);   
									break;}




}
	
}



void main(){
FileSystem *s=new FileSystem;
menu(s);

getch();}


这篇关于如何在树的任何节点中添加链接列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆