主要思路:
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()函式遞迴輸出
1void print(int cnt, struct node*p)213
while (p->file)//再輸出檔案
1418 }
1 #include 2 #include3 #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行,每行有如下格式的...