У меня небольшая проблема с заданием, которое я должен закончить. Мы должны реализовать рекурсивную программу "ls", которая распечатывает "n" самые большие файлы. Но есть некоторые проблемы.
1)
У меня есть три файла: main.c, list.c и list.h. В list.h я включил string.h, stdio.h, stdlib.h, объявил struct (char * filename, long long filesize и struct element * next) и два метода (append, printlist). В list.c я включил list.h и реализовал два метода: append и printlist. В main.c я включил unistd.h, dirent.h, sys / stat.h и list.h.
Когда я пытаюсь скомпилировать его с помощью "gcc main.c", я получаю сообщение об ошибке ", использующий необъявленные методы append и printlist", но если я использую Eclipse, он прекрасно собирается. Как я могу решить это?
Точные ошибки
/tmp/ccLbHnqR.o: In function `main':
main.c:(.text+0x189): undefined reference to `printliste'
/tmp/ccLbHnqR.o: In function `ftop':
main.c:(.text+0x1f6): undefined reference to `append'
2)
Чтобы реализовать эту функциональность, я попытался использовать самосортирующийся список, т.е. проходить по списку до последнего значения, которое больше нового значения, затем установить указатель нового значения на указатель последнего значения и указатель последнего значения является новым значением.
Теоретически это должно работать, но на практике это не так.
Методы добавления выглядят так
void append(struct element **lst, char* filename, long long filesize){
struct element *newElement;
struct element *lst_iter = *lst;
newElement = malloc(sizeof(*newElement)); // create new element
newElement->filename = filename;
newElement->filesize = filesize;
newElement->next = NULL; // important to find the end of the list
if ( lst_iter != NULL ) { // if elements are existing
//if our element is bigger than the first element
if(lst_iter->filesize < newElement->filesize){
newElement->next = lst_iter;
*lst = newElement;
} else {
while(lst_iter->next != NULL){
if(lst_iter->filesize > newElement->filesize) lst_iter = lst_iter->next;
else break;
}
newElement->next = lst_iter->next;
lst_iter->next = newElement;
}
}
else // if the list is empty our value is the new value
*lst=newElement;
}
Я использую этот метод из своего метода "ftop", который получает каталог, добавляет каждый файл в этом каталоге в список и для каждого каталога снова вызывает "ftop".
void ftop(char* path){
DIR *dir;
struct dirent *ent;
//open the directory
dir = opendir(path);
if (dir != NULL) {
//for each file/directory in it
while ((ent = readdir(dir)) != NULL) {
struct stat st;
//if it is a file, append it to the list
if(S_ISREG(st.st_mode)){
append(&list, ent->d_name, st.st_size);
} else {
//if it is a directory, use recursion
ftop(ent->d_name);
}
}
}
}
Но я не понимаю, почему это не работает. Я знаю, что вы не хотите делать домашнюю работу других, но я был бы благодарен за каждый совет, который вы могли бы дать мне.
P.s .: Если вы хотите полный код
main.c
list.c