gpt4 book ai didi

c - 添加到 from 目录的链表数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:37 26 4
gpt4 key购买 nike

我一直在尝试创建一个链表数组。该数组大小为 26,每个部分对应于字母表中的一个字母。用户输入PC的一个目录,该目录下的任何文件夹或文件的名称将根据它们的开头字母添加到数组中的链表中。

我是如何尝试做到的->

#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;
}

我添加节点的地方以及问题所在(printf("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的函数,directory为已经校验存在的计算机目录:

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”)时程序似乎没问题,但是每秒尝试添加一次就像一个“ccc.txt”之后的一个“ccd.txt”一样,当它一直持续下去或直到电脑崩溃时

最佳答案

您没有检查 addNode 中的正确值来查找列表插入点。

通过链表的指针到指针枚举经常用于从头指针遍历到链表中的最后一个下一个指针,每次保存地址所述指针的。当你到达一个 NULL 时(在空列表的情况下它将是 head),你停止,你可以通过取消引用使用你的指针到指针分配您的新节点地址。

如果你想在尾部插入,方法是这样的:

#define DATA_MAX_LEN    50

void addNode(struct node **q,const char *d)
{
// assumes a null-terminated linked list
while (*q)
q = &(*q)->next;

*q = malloc( sizeof **q );

// ensures truncation and termination
strncpy((*q)->data,d,DATA_MAX_LEN-1);
(*q)->data[ DATA_MAX_LEN-1] = 0;

// make sure we terminate the list at our new node
(*q)->next = NULL;
}

从更新的 returner 函数中调用,如下所示:

void returner(char* directory)
{
DIR *dp = opendir (directory);
if (dp)
{
struct dirent *ep;
while ((ep = readdir(dp)))
{
// skip parent and self symbolic links
if (ep->d_name[0] == '.' && (ep->d_name[1] == 0 || (ep->d_name[1] == '.' && ep->d_name[2] == 0)))
continue;

for(int i=0; i<26 ; i++)
{
if(StartsWith(ep->d_name, basis[i]))
addNode(nodeArray+i, ep->d_name);
}
}
closedir (dp);
}
}

关于c - 添加到 from 目录的链表数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com