Вопрос о простом односвязном списке - значения узла не отображаются - PullRequest
0 голосов
/ 01 марта 2019

Я нуб, пытаюсь создать односвязный связанный список в C, основанный на массиве строк (где массив может иметь разную длину, а элементы разного размера).В коде, который я изменил, я, кажется, получаю правильное количество указателей, но ни одно из значений Node не отображается.Требуемый вывод на консоль - голова -> один -> два -> и т. Д. (Сейчас я только получаю голову -> -> ->)

// starter code from https://www.tutorialspoint.com/learn_c_by_examples/simple_linked_list_program_in_c.htm

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

struct node {
    const char *data;
    struct node *next;
};

struct node *head = NULL;
struct node *current = NULL;

//display the list
void printList() {

    struct node *ptr = head;

    printf("\n[head] =>");
    //start from the beginning
    while(ptr != NULL) {  
        printf(" %s =>", ptr -> data);
        ptr = ptr -> next;
    }

    printf(" [null]\n");
}

//insert link at the first location
void insert(const char data) {
    //create a link
    struct node *link = (struct node*) malloc(sizeof(struct node));

    //link->key = key;
    link -> data = &data;

    //point it to old first node
    link -> next = head;

    //point first to new first node
    head = link;
    }

int main() {
    // create an array of strings, to be used to dynamically populate linked list
    const char *strings[] = {"one" ,"two","three", "four", "somewhereselse", "onemore"};

    // below line to find number of items in an array of strings, assign to n
    int n = sizeof(strings) / (2 * sizeof(int));

    for (int j = 0; j < n; j++){
        const char *temp = strings[j];
        insert(*temp);
        //printf("%s\n", temp);

    }

    printList();
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

попробуйте этот код вместо

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

struct node {
    char *data;
    struct node *next;
};

struct node *head = NULL;
struct node *current = NULL;

//display the list
void printList() {

    struct node *ptr = head;

    printf("\n[head] =>");
    //start from the beginning
    while(ptr != NULL) {  
        printf(" %s =>", ptr -> data);
        ptr = ptr -> next;
    }

    printf(" [null]\n");
}

//insert link at the first location
void insert(char *data) {
    //create a link
    struct node *link = (struct node*) malloc(sizeof(struct node));
link->data=malloc(strlen(data)*sizeof(char)); //don't forget malloc for string : link->data
    strcpy(link->data,data); //copy  parameter named data to link->data

    //point it to old first node
    link -> next = head;

    //point first to new first node
    head = link;

    }

int main() {
    // create an array of strings, to be used to dynamically populate linked list
    const char *strings[] = {"one" ,"two","three", "four", "somewhereselse", "onemore"};

    // below line to find number of items in an array of strings, assign to n
    int n = sizeof(strings) / (2 * sizeof(int));
    char temp[20]={0};
    for (int j =n-1; j >=0; j--){
        //const char *temp = strings[j];
        strcpy(temp,strings[j]);
        insert(temp);
        //printf("%s\n", temp);

    }

    printList();
    return 0;
}
0 голосов
/ 01 марта 2019

Мой код не работал из-за 3 частей синтаксиса, которые я определил ниже

// starter code from https://www.tutorialspoint.com/learn_c_by_examples/simple_linked_list_program_in_c.htm

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

struct node {
    const char *data;
    struct node *next;
};

struct node *head = NULL;
struct node *current = NULL;

//display the list
void printList() {

    struct node *ptr = head;

    printf("\n[head] =>");
    //start from the beginning
    while(ptr != NULL) {  
        printf(" %s =>", ptr -> data);
        ptr = ptr -> next;
    }

    printf(" [null]\n");
}

//insert link at the first location
// first change insert *
void insert(const char *data) {
    //create a link
    struct node *link = (struct node*) malloc(sizeof(struct node));

    //link->key = key;
    // 2nd change remove &
    link -> data = data;

    //point it to old first node
    link -> next = head;

    //point first to new first node
    head = link;
    }

int main() {
    // create an array of strings, to be used to dynamically populate linked list
    const char *strings[] = {"one" ,"two","three", "four", "somewhereselse", "onemore"};

    // below line to find number of items in an array of strings, assign to n
    int n = sizeof(strings) / (2 * sizeof(int));

    for (int j = 0; j < n; j++){
        const char *temp = strings[j];
        // 3rd change remove * before temp
        insert(temp);
        //printf("%s\n", temp);

    }

    printList();
    return 0;
}
0 голосов
/ 01 марта 2019
void insert(const char data) 

Это неправильно.

Вы вставляете один символ.Ну, в частности, вы вставляете указатель на этот единственный символ:

link -> data = &data;

... но (а) этот символ находится в стеке, поэтому указатель не будет оставаться действительным в течение очень долгого времени, и(б) это не та строка, о которой вы думаете.

Это:

insert(*temp);

Должно быть:

insert(temp);

... и вам следует изменитьПрототипы и реализация для соответствия.

Обратите внимание также, что вы могли бы захотеть взять копию строки (используйте strdup, но помните об утечках памяти), а не указывать наоригинал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...