7-30 目錄樹(30 分)
在ZIP歸檔文件中,保留着全部壓縮文件和目錄的相對路徑和名稱。當使用WinZIP等GUI軟件打開ZIP歸檔文件時,能夠從這些信息中重建目錄的樹狀結構。請編寫程序實現目錄的樹狀結構的重建工做。node
輸入格式:
輸入首先給出正整數N(≤104),表示ZIP歸檔文件中的文件和目錄的數量。隨後N行,每行有以下格式的文件或目錄的相對路徑和名稱(每行不超過260個字符):數據結構
- 路徑和名稱中的字符僅包括英文字母(區分大小寫);
- 符號「\」僅做爲路徑分隔符出現;
- 目錄以符號「\」結束;
- 不存在重複的輸入項目;
- 整個輸入大小不超過2MB。
輸出格式:
假設全部的路徑都相對於root目錄。從root目錄開始,在輸出時每一個目錄首先輸出本身的名字,而後以字典序輸出全部子目錄,而後以字典序輸出全部文件。注意,在輸出時,應根據目錄的相對關係使用空格進行縮進,每級目錄或文件比上一級多縮進2個空格。ide
輸入樣例:
7 b c\ ab\cd a\bc ab\d a\d\a a\d\z\
輸出樣例:
思路:記得數據結構課的時候確實講過數的建立,可是一直沒有本身動手實現過,今個兒這個要點時間。首先學了下字符串按照指定符號分割,而後百度了下輸的建立,因此先待續~
注意先輸出子目錄而後在輸出文件,子目錄還要字典排序!對樹進行排序又要玩死我了😯root a d z a bc ab cd d c b
參考了一個思路很清晰的代碼,來自http://blog.csdn.net/Changxing898/article/details/52367514spa
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> typedef struct node *Node; struct node{ char *name; bool isMulu; //先判斷是否是目錄,是目錄纔有file和mulu,不然只可能有brother Node File; //指示本目錄的子目錄 Node Mulu; //指示本目錄的子文件 Node Brother; //指示和本目錄或文件平行的目錄或文件 }Head; void Print(Node, int); void Read(); Node New(char*); Node InsertMulu(Node, char*); Node InsertFile(Node, char*); int main() { int n; scanf("%d", &n); Head.name = (char*)malloc(sizeof(char)* 5); strcpy(Head.name, "root"); Head.File = NULL; Head.Mulu = NULL; Head.Brother = NULL; Head.isMulu = true; for (int i = 0; i < n; i++) { getchar(); Read(); } Print(&Head, 0); return 0; } void Read() { char FileName[266]; Node temp = &Head; scanf("%s", FileName); char words[266]; int j, L = 0; for (int i = 0; i < strlen(FileName); i++) { if (FileName[i] == '\\'){ for (j = L; j < i; j++) words[j - L] = FileName[j]; words[j - L] = '\0'; temp->Mulu = InsertMulu(temp->Mulu, words); temp = temp->Mulu; while (strcmp(temp->name, words))temp = temp->Brother; L = i + 1; } } if (L < strlen(FileName)){ for (int j = L; j <= strlen(FileName); j++) words[j - L] = FileName[j]; temp->File = InsertFile(temp->File, words); } } Node InsertMulu(Node H, char *k) { if (!H || strcmp(H->name, k) > 0){ Node temp = New(k); temp->Brother = H; return temp; } if (strcmp(H->name, k) == 0)return H; H->Brother = InsertMulu(H->Brother, k); return H; } Node InsertFile(Node H, char*k) { if (!H || strcmp(H->name, k) > 0){ Node temp = New(k); temp->isMulu = false; temp->Brother = H; return temp; } H->Brother = InsertFile(H->Brother, k); return H; } Node New(char *k) { Node temp = (Node)malloc(sizeof(struct node)); temp->name = (char*)malloc(sizeof(char)*(strlen(k) + 1)); strcpy(temp->name, k); temp->Brother = NULL; temp->File = NULL; temp->Mulu = NULL; temp->isMulu = true; return temp; } void Print(Node H, int space) { if (H){ for (int i = 0; i < space; i++) printf(" "); printf("%s\n", H->name); if (H->isMulu == true) Print(H->Mulu, space + 2); Print(H->File, space + 2); Print(H->Brother, space); } }