7 30 目錄樹 30分

2021-10-04 11:26:05 字數 3068 閱讀 2402

主要思路:

1.定義結構體node,包含1)名字name(2)指向下級目錄指標ctl(3)指向下級檔案指標file(4)指向同級目錄或檔案指標next(取決於它本身是目錄還是檔案)。

定義乙個全域性的指標ptr,指向上乙個處理完畢的結點,比如一開始在輸入「a\b\c」的中,ptr一開始指向root,從root開始處理a,處理完後ptr指向a,然後從ptr(即a)開始處理b,處理完後ptr指向b,再從ptr(即b)開始處理c。

2.處理一行資料時,字串後帶\的為目錄,否則為檔案。

3.假設插入乙個目錄型別結點s,從某一結點(設為x)開始,如果x的目錄為空,直接插入;如果不為空,從x的指向的目錄a開始,s與a比較,如果小於(按字典序排在前面),則在x和a之間插入s即可,否則,s繼續跟a的next結點b比較,如果s小於b了,則在a與b之間插入s,以此類推……如果到鍊錶遍歷完畢都沒有找到比s大的結點,說明s最大,需要放在最後,在遍歷結束後直接讓鍊錶最後乙個結點指向s即可。在s插入完畢後,ptr指向s,表明下乙個結點的處理是從ptr結點開始的,如本段開頭s的插入是從x結點開始的。

如果s跟x的目錄重名了,則不需要插入s,直接令ptr指向x即可,然後開始下乙個結點的處理(那就是從x,即ptr開始處理了)

4.假設插入乙個檔案型別結點s,方法與上述插入目錄結點時類似,只是插入檔案結點時,是小於(即按字典序規則排在前面),等於(即重名)的時候插入,因為當

檔案重名時,不能說只有乙個檔案,有n個檔案重名那就是有n個檔案,所以s仍然需要插入,這裡跟目錄的插入不同,重名的目錄即使有多個也是只看成乙個的,所以不需要重複插入了。

5.還要注意,在a和c之間插入b時,需要分情況處理,如果a與b同級,是a的next指向b;如果a比高一級,則a的ctl或者file指標指向b。

6.使用print()函式遞迴輸出

1

void print(int cnt, struct node*p)213

while (p->file)//再輸出檔案

1418 }

1 #include 2 #include 

3 #include 4

5using

namespace

std;

6 typedef struct node//

檔案或目錄的結點7;

13struct node root;//

定義根節點為全域性變數

14struct node* ptr = null;//

定義乙個全域性的指向node的指標

15//

16//

如果沒有新插入結點(只有一種情況,即有同名目錄的時候,ptr直接指向同名的那個結點,然後直接退出插入函式

17//

當處理完一行資料的時候,ptr指向root,因為每一行都是從root開始處理的

18bool smaller(char s1, char s2)//

按照字典序規則比較兩個字串,s119

30if (s1[j] != '

\0' && s2[j] == '\0'

)3134if (s1[j] 3538

else

if (s1[j] >s2[j])

3942}43

}44else

if (s1[i] < s2[i])return

true;45

else

return

false;46

}47}48

bool equal(char s1, char s2)//

比較兩個字串,相等即返回true

4956}57

return

true;58

}59void ins_file(char name)//

插入乙個檔案結點

6068

else

69

85 p_pio = p;//

86 p = p->next;87}

88if (flag == 0)//

flag==0,說明上面過程沒有插入,所以這裡直接將s放最後面

8992

}93 ptr = s;//

ptr需要指向新插入的結點94}

95void ins_ctl(char name)//

插入乙個目錄結點

96104

else

105116

else

if (smaller(s->name, p->name))

117

126 p_pio =p;

127 p = p->next;

128}

129if (flag == 0

)130

133}

134 ptr =s;

135}

136void print_sp(int n)//

輸出空格的函式

137141

int d = 0

;142

int cnt = -2

;143

struct node* p = &root;

144void print(int cnt, struct node* p)//

輸出最終結果的函式

145157

while (p->file)

158162

}163

intmain()

164185

else

if (s[j] == '\0'

)186

194else

195198

}199

}200 print(0, &root);

201return0;

202 }

7 30 目錄樹 30分

在zip歸檔檔案中,保留著所有壓縮檔案和目錄的相對路徑和名稱。當使用winzip等gui軟體開啟zip歸檔檔案時,可以從這些資訊中重建目錄的樹狀結構。請編寫程式實現目錄的樹狀結構的重建工作。輸入格式 輸入首先給出正整數n 10 4 表示zip歸檔檔案中的檔案和目錄的數量。隨後n行,每行有如下格式的檔...

目錄樹 (30 分)

在zip歸檔檔案中,保留著所有壓縮檔案和目錄的相對路徑和名稱。當使用winzip等gui軟體開啟zip歸檔檔案時,可以從這些資訊中重建目錄的樹狀結構。請編寫程式實現目錄的樹狀結構的重建工作。輸入首先給出正整數n 10 4 表示zip歸檔檔案中的檔案和目錄的數量。隨後n行,每行有如下格式的檔案或目錄的...

5 30 目錄樹 30分

在zip歸檔檔案中,保留著所有壓縮檔案和目錄的相對路徑和名稱。當使用winzip等gui軟體開啟zip歸檔檔案時,可以從這些資訊中重建目錄的樹狀結構。請編寫程式實現目錄的樹狀結構的重建工作。輸入格式說明 輸入首先給出正整數n 104 表示zip歸檔檔案中的檔案和目錄的數量。隨後n行,每行有如下格式的...