Hehe, nếu em sử dụng C++ thì có thể sử dụng Vector trong C++ có đầy đủ cả insert, delete, ... cả
Tiếp nữa là các hàm delete, insert, nên đưa vào lớp CNode chứ không nên đưa vào lớp CTree
Ngoài ra em nên tạo hai loại node là nodeFolder và nodeFile, chỉ node Folder mới chứa node con và node file thì chứ nội dung.
Code:
#include <stdlib.h>
#include <vector.h>
class CNode
{
public:
char *strName;
CNode(char* pstrName)
{
strName = pstrName;
}
}
class CNodeFolder : public CNode
{
public:
vector<CNode*> m_vtChild;
CNodeFolder(char* strName) : CNode(strName)
{
}
void Insert(CNode *nodeCur)
{
m_vtChild.push(nodeCur);
}
void Delete(int i)
{
mi_vtChild.erase(mi_vtChild.begin() + i);
}
int GetElementCount()
{
return m_vtChild.size();
}
CNode* GetAt(int i)
{
return m_vtChild[i];
}
}
class CNodeFile : public CNode
{
public:
vector<CNode*> m_vtChild;
void* m_pContent;
int m_iSize;
CNodeFile(char* strName) : CNode(strName)
{
}
void SetContent(void* pContent, iSize)
{
m_pContent = pContent;
m_iSize = iSize;
}
}
Như vậy để tạo cây em chỉ cần một node đầu tiên là gốc, mỗi một node thuộc cây có thể add, delete, ... bao nhiêu node tùy ý.
Code:
CNodeRoot nodeRoot("");
CNodeFolder nodeCDrv("C:");
CNodeFolder nodeDDrv("D:");
CNodeFolder nodeGames("Games");
CNodeFolder nodeWindows("Windows");
CNodeFolder nodeProgramFiles("Program files");
CNodeFolder nodeSystem32("System32");
CNodeFile nodeKernelDll("Kernel32.dll");
// My computer
nodeRoot.Insert(&nodeCDrv); // C driver
nodeRoot.Insert(&nodeDDrv); // D driver
// C driver
nodeCDrv.Insert(&nodeGames); // c:\games
nodeCDrv.Insert(&nodeWindows); // c:\Windows
nodeCDrv.Insert(&nodeProgramFiles); // c:\Program Files
// Windows folder
nodeWindows.Insert(&nodeSystem32); // c:\Windows\System32
// System32 folder
nodeKernelDll.SetContent("Test node file", 15);
nodeSystem32.Insert(&nodeKernelDll); // c:\Windows\System32\Kernel32.dll
Tổ chức trên là khá đủ đơn giản để làm việc,
Có rất nhiều cách cải tiến khác để có thể làm việc tốt hơn về hiệu năng hoặc chức năng.
Chẳng hạn em có thể bổ sung:
- Thêm lệnh Dir vào CNodeFolder
- Em có tạo ra những loại thư mục đặc biệt như:
+ CNodeDriver thừ kế từ CNodeFolder chuyên cho các loại ổ đĩa như C:, D: với các lệnh như tính dung lượng ổ đĩa, dung lượng còn lại.
+ CNodeRecycleBin thừa kế từ CNodeFolder và có các lệnh Restore, Empty
+ CNodeDesktop cũng thừa kế từ CNodeFolder với một lệnh Dir trình bày kết quả khác hẳn so với CNodeFolder thông thường...
- Cải tiến cách lưu nội dung của file thay vì chỉ lưu bằng một con trỏ void.
Tuy nhiên thực tế các hệ điều hành quản lý thư mục , file theo cách khác, nói thì dài dòng nhưng nó không sử dụng vector theo kiểu mảng như trên mà nó dùng một dạng gần giống như danh sách liên kết, tất nhiên tổ chức phức tạp hơn nhiều.
Tuy nhiên anh nghĩ đây có vẻ chỉ như một bài tập, không bắt tìm hiểu cấu trúc quản lý file của các hệ điều hành mà chỉ rèn luyện lập trình C++, hướng đối tượng, và cấu trúc dữ liệu cây nên chỉ cần cấu trúc tổ chức cây như trên là tốt rồi.
Nếu có điều kiện, thời gian và đam mê em tìm hiểu về FAT, NTFS, còn Linux nó sử dụng cái gì ai biết nhắc giùm cái. Nếu không hiểu có thể lên đây tiếp tục hỏi.
Bookmarks