我一直在尝试创建一系列链接列表。数组大小为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(&#34; 1&#34;)可以阻止我的计算机基本崩溃):
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;
}
}
}
将第一个节点添加到阵列上的某个位置(例如&#34; aaa.txt&#34; &#34; bbb.txt&#34; &#34; ccc.txt&#34; &#34; ddd.txt&#34;,但尝试添加一秒钟就像&#34; ccd.txt&#34;在&#34; ccc.txt&#34;之后它永远存在或直到电脑崩溃
时存在答案 0 :(得分:1)
您没有在addNode
中查找正确的值来查找列表插入点。
通过链表的指针到指针枚举经常用于从头指针走到列表中的最后一个next
指针,每次都按住地址 -指针。当你到达一个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);
}
}