Я пытался создать массив связанных списков. Массив равен 26, каждая часть соответствует букве алфавита. Пользователь вводит каталог ПК, а имя любых папок или файлов в этом каталоге затем добавляется в связанный список в массиве, основываясь на том, с какой буквы они начинаются.Массив связанных списков, добавленных из каталога
Как я пытался сделать IT->
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
Мой узел и его заявление:
struct node{
char data[50];
struct node *next;
};
struct node* nodeArray[26];
Мой алфавит:
const char* basis[26] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
Строка сравнения функцию проверить, какой связанный список в массиве идет мое слово (сравнивается с алфавитом)
int StartsWith(const char *a, const char *b)
{
if(strncasecmp(a, b, strlen(b)) == 0) return 1;
return 0;
}
Где я добавить узел, а также, где проблема есть (Е («1») есть, чтобы остановить мой компьютер от в основном сбой):
void addNode(struct node **q,const char *d){
if(((*q)->data)==NULL){
*q = malloc(sizeof(struct node));
strncpy((*q)->data,d,50);
(*q)->next = NULL;
} else {
(*q)->next = malloc(sizeof(struct node));
*q = (*q)->next;
printf("1");
addNode(q,d);
}
}
функция, которая вызывает AddNode, каталог это компьютер каталог, который уже был проверен на существование:
void returner(char* directory){
int i;
DIR *dp;
struct dirent *ep;
char* tempD;
dp = opendir (directory);
struct node **z;
while ((ep = readdir(dp))){
tempD = (char*)malloc(50);
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..")){
} else {
strncpy(tempD, ep->d_name, 50);
for(i=0; i<26 ; i++){
if(StartsWith(tempD, basis[i])){
z = &nodeArray[i];
addNode(z,tempD);
print();
}
}
}
free(tempD);
}
closedir (dp);
}
функция печати:
void print(){
int i;
struct node *temp;
for(i=0 ; i < 26; i++){
temp = malloc(sizeof(struct node));
temp = nodeArray[i];
while(temp != NULL){
printf("%s\n",temp->data);
temp = temp->next;
}
}
}
Программа кажется прекрасной при добавлении первого узла в пятно на массиве, такое как «aaa.txt» «bbb.txt» «ccc.txt» «ddd.txt», но как только одна секунда пытается быть добавлена как «ccd.txt» после «ccc.txt» существует, когда он держится навсегда или до сбоя ПК
Я вижу, спасибо это прекрасно работает! Это первый раз, когда я делаю что-то подобное в C, поэтому, я думаю, я просто зашел слишком далеко, поскольку я попытался исправить это и в конечном итоге усложнил процесс. –
@SeanM вы были ближе к хорошему, чем большинство людей, как правило, впервые они пытаются работать с указателем на указатель на C. В любом случае, рад, что это помогло. Удачи. – WhozCraig
@SeanM, вероятно, тоже должен был упомянуть об этом: у вас есть утечка памяти в вашей функции 'print'. В этой строке 'malloc' нет никакого бизнеса. Это не Java или C#. – WhozCraig