main.c (2480B)
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 typedef struct Dir_ Dir; 6 7 typedef struct Dir_ { 8 char name[32]; 9 int size, dir; 10 int children; 11 Dir *parent; 12 Dir *files[32]; 13 } Dir; 14 15 Dir* changeDir(Dir *dir, Dir *root, char *name) 16 { 17 printf("cd %s\n", name); 18 if ( name[0] == '/' ) return root; 19 if ( name[0] == '.' ) return dir->parent; 20 21 for ( int i = 0; i < dir->children; i++ ) 22 { 23 if(strcmp( dir->files[i]->name, name ) == 0) 24 { 25 return dir->files[i]; 26 } 27 } 28 } 29 30 void list(Dir *dir, int d) 31 { 32 for (int i = 0; i < d; i++) printf("'-"); 33 printf("%s", dir->name); 34 if (dir->dir) printf(" (d)"); 35 else printf(" %d", dir->size); 36 printf("\n"); 37 for (int i = 0; i < dir->children; i++) 38 { 39 list(dir->files[i], d+1); 40 } 41 } 42 43 int findlarge(Dir *dir, int *globalsum) { 44 45 if (!dir->dir) { 46 return dir->size; 47 } 48 49 int sum = 0; 50 for (int i = 0; i < dir->children; i++) 51 { 52 sum += findlarge(dir->files[i], globalsum); 53 } 54 if (sum <= 100000) { 55 *globalsum += sum; 56 } 57 58 return sum; 59 } 60 61 int main() 62 { 63 64 char *line = 0; 65 size_t len; 66 ssize_t nlen; 67 68 Dir *root = malloc(sizeof(Dir)); 69 root->children = 0; 70 root->dir = 1; 71 strcpy(root->name, "/"); 72 Dir *head = root; 73 74 int globalsum = 0; 75 76 while( (nlen = getline(&line, &len, stdin)) != -1 ) 77 { 78 line[nlen-1] = '\0'; 79 if ( line[0] == '$' ) 80 { 81 if ( line[2] == 'c' ) head = changeDir(head, root, line+5); 82 } 83 else if ( line[0] == 'd' ) 84 { 85 Dir *newdir = malloc(sizeof(Dir)); 86 strcpy(newdir->name, line+4); 87 newdir->dir = 1; 88 newdir->children = 0; 89 newdir->parent = head; 90 head->files[head->children] = newdir; 91 head->children++; 92 } 93 else { 94 Dir *newdir = malloc(sizeof(Dir)); 95 newdir->size = atoi( strsep(&line, " ") ); 96 strcpy(newdir->name, strsep(&line, " ")); 97 head->files[head->children] = newdir; 98 head->children++; 99 100 // printf("file %d %s\n", newdir->size, newdir->name); 101 // printf("name %s\n", root->files[0]->name); 102 } 103 printf("cmd '%s' head: %s\n", line, head->name); 104 list(root, 0); 105 } 106 107 list(root, 0); 108 109 findlarge(root, &globalsum); 110 printf("sum: %d\n", globalsum); 111 }