【WEISS算法书】书上简单的文件系统

本文介绍了一个用于表示文件和目录的结构体,并通过递归方式实现了文件系统的遍历和目录大小的计算。该程序定义了DirectoryOrFile结构体来存储文件或目录的相关信息,并提供了列出目录内容和计算目录总大小的功能。

算法书P67至P69:

Code:
  1. #include <iostream>   
  2. #include <string>   
  3.   
  4. using namespace std;   
  5.   
  6. struct DirectoryOrFile;   
  7. typedef DirectoryOrFile* ptrDirectoryOrFile;   
  8. struct DirectoryOrFile   
  9. {   
  10.     unsigned int size;   
  11.     bool flag;   
  12.     string name;   
  13.     ptrDirectoryOrFile firstChild;   
  14.     ptrDirectoryOrFile nextSibling;   
  15.        
  16.     DirectoryOrFile(unsigned int s,bool f,string n,ptrDirectoryOrFile fc,ptrDirectoryOrFile ns):   
  17.     size(s),flag(f),name(n),firstChild(fc),nextSibling(ns){}   
  18.     bool isDirectory();   
  19. };   
  20.   
  21. bool DirectoryOrFile::isDirectory()   
  22. {   
  23.     return flag;   
  24. }   
  25.   
  26. static void ListDir(ptrDirectoryOrFile ptrToDOF,unsigned int depth)   
  27. {   
  28.     if(ptrToDOF == NULL)   
  29.     {   
  30.         return;   
  31.     }   
  32.     else  
  33.     {   
  34.         for(unsigned i=0;i<depth;i++)   
  35.         {   
  36.             cout<<' ';   
  37.         }   
  38.         cout<<ptrToDOF->name<<endl;   
  39.         if(ptrToDOF->isDirectory())   
  40.         {   
  41.             ListDir(ptrToDOF->firstChild,depth+2);   
  42.         }   
  43.         ListDir(ptrToDOF->nextSibling,depth);   
  44.     }   
  45. }   
  46.   
  47. void ListDirectory(ptrDirectoryOrFile ptrToDOF)   
  48. {   
  49.     ListDir(ptrToDOF,0);   
  50. }   
  51.   
  52. unsigned int SizeDirectory(ptrDirectoryOrFile ptrToDOF)   
  53. {   
  54.     if(ptrToDOF == NULL)   
  55.     {   
  56.         return 0;   
  57.     }   
  58.     else  
  59.     {   
  60.         unsigned int sum=ptrToDOF->size;   
  61.         if(ptrToDOF->isDirectory())   
  62.         {   
  63.             sum+=SizeDirectory(ptrToDOF->firstChild);   
  64.         }   
  65.         sum+=SizeDirectory(ptrToDOF->nextSibling);   
  66.         return sum;   
  67.     }   
  68. }   
  69.   
  70. int main()   
  71. {   
  72.     DirectoryOrFile fHuman2(23,false,"路人乙",NULL,NULL);   
  73.     DirectoryOrFile fHuman1(12,false,"路人甲",NULL,&fHuman2);   
  74.        
  75.     DirectoryOrFile fProg2(22,false,"程序3",NULL,NULL);   
  76.     DirectoryOrFile dProg2(1,true,"程序文件夹2",&fProg2,NULL);   
  77.     DirectoryOrFile fProg1(34,false,"程序1",NULL,&dProg2);   
  78.        
  79.     DirectoryOrFile dProg1(1,true,"程序文件夹1",&fProg1,NULL);   
  80.     DirectoryOrFile dName(1,true,"人物文件夹",&fHuman1,&dProg1);   
  81.        
  82.     DirectoryOrFile dMain(1,true,"主文件夹",&dName,NULL);   
  83.   
  84.     ListDirectory(&dMain);   
  85.     cout<<SizeDirectory(&dMain)<<endl;   
  86.   
  87.     return 0;   
  88. }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值