लिंक की गई सूची के बारे में जानकारी की समीक्षा करने के बाद (अभी भी विषय के आसपास अपना सिर बनाने की कोशिश कर रहा हूं)। मैं निम्नलिखित कोड को फिर से लिखता हूं, और यह अंतिम संस्करण है: (कोड का उद्देश्य इस फाइल एक्सटेंशन के साथ उस निर्देशिका में मिली फाइलों की एक लिंक की गई सूची बनाने के लिए एक निर्देशिका, और एक वाइल्डकार्ड के लिए संकेत देना है।

#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct nlist{
    char *data;
    struct nlist *next;
}Node;


Node* insert(Node*, char*);


void show(Node*);


Node* insert(Node *Head, char *value)
{
    Node *new_string;
    new_string = (Node *)malloc(sizeof(Node));
    new_string->data = malloc(strlen(value)+1);
    strcpy(new_string->data,value);
    Node *check;
    check = (Node *)malloc(sizeof(Node));

    if(Head == NULL){
        Head = new_string;
        Head->next = NULL;
    }
    else{
        check = Head;
        while(check->next != NULL)
            check = check->next;

        check->next = new_string;
        new_string->next = NULL;
    }
    return Head;
}

void show(Node *Head)
{
    Node *check;
    check = (Node *)malloc(sizeof(Node));
    check = Head;
    if (check == NULL){
        return;
    }

    while(check != NULL) {
        printf("%s", check->data);
        check=check->next;
    }
    printf("\n");
}

void listFilesRecursively(char *path, char *suffix);


int main()
{
    char path[100];
    char suffix[100];

    // Input path from user
    // Suffix Band Sentinel-2 of Type B02_10m.tif

    printf("Enter path to list files: ");
    scanf("%s", path);
    printf("Enter the wildcard: ");
    scanf("%s", suffix);

    listFilesRecursively(path, suffix);

    return 0;
}


int string_ends_with(const char * str, const char * suffix)
{
    int str_len = strlen(str);
    int suffix_len = strlen(suffix);

    return 
        (str_len >= suffix_len) &&
        (0 == strcmp(str + (str_len-suffix_len), suffix));
}

void listFilesRecursively(char *basePath, char *suffix)
{
    char path[1000];
    struct dirent *dp;
    DIR *dir = opendir(basePath);
    Node *Head = NULL;

    if (!dir)
        return;

    while ((dp = readdir(dir)) != NULL)
    {
        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
        {
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);

            if (string_ends_with(path, suffix))
                Head = insert(Head, path);
            listFilesRecursively(path, suffix);
        }
    }
    //show(Head);
    /*
    Node *check;
    check = (Node *)malloc(sizeof(Node));
    check = Head;
    if (check == NULL){
        return;
    }

    while(check != NULL) {
        printf("%s", check->data);
        //open_array(check->data);
        check=check->next;
    }
    printf("\n");
    //return Head;
    */

    Node *p;
    p = (Node *)malloc(sizeof(Node));
    for (p = &Head; p != NULL; p = p->next){
        printf(stdout, "Data: %s\n", p->data);
    }

    closedir(dir);
}

मेरी समस्या: मैंने उस लूप पर टिप्पणी की जिसमें मैं नोड्स डेटा को प्रिंट करने में सक्षम हूं जिसे मैंने सम्मिलित (हेड, पथ) फ़ंक्शन का उपयोग करते समय जंजीर किया था। हालांकि, जब मैं ऐसा करने के लिए लूप के लिए उपयोग कर रहा हूं

Node *p // to create a Node pointer
p = (Node*)malloc(sizeof(Node)); // to allocate space for that node
for (p = &Head; p!= NULL; p = p->next){
    printf(stdout, "Data: %s\n", p->data); // to print the nodes in the for loop starting by getting the address of the Head of the linked list
}

मैं सेगमेंटेशन गलती क्यों करता हूं? क्या लूप के लिए एक लिंक्ड सूची पर पुनरावृत्ति संभव है, सी में थोड़ी देर के लूप का उपयोग करने जैसा ही है?

0
Roger Almengor 7 नवम्बर 2019, 18:07

1 उत्तर

सबसे बढ़िया उत्तर
Node *p;

if (!(p = (Node*)malloc(sizeof(Node))))
    return;
for (p = Head; p != NULL; p = p->next){
    printf(stdout, "Data: %s\n", p->data);
}

अपने प्रमुख के पते का संदर्भ देने की आवश्यकता नहीं है क्योंकि यह पहले से ही एक है।

अपने कार्यक्रमों को मॉलोक विफल होने से बचाना भी एक अच्छी आदत है।

1
rzobot 7 नवम्बर 2019, 15:48