Создание связанного списка строк - PullRequest
1 голос
/ 06 апреля 2019

Я новичок в структурах данных, а также в связанных списках.Я работаю над проектом с именем Проверка доступности продуктов Amazon с использованием дерева в C .Поэтому я хочу хранить строки в каждом узле дерева, но при сохранении строк код не показывает никаких ошибок, но вывод также не печатается.Я передал узел функции print для печати строки, но ничего не печатается.

Я поделился кодом только для одной строки и одного узла.Я работаю над Ubuntu и пишу код на языке C.

Вот мой код:

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

typedef struct node {
    char clothing[10];
    struct node *next;
} node;

// 1) creating node

node *create(char const ch[]) {
    int i;
    node *head = NULL;
    node *temp = NULL;
    node *p = NULL;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->clothing[10] = ch[10];
    temp->next = NULL;
    return temp;
}

// 2) print 

void print(node *head) {
    node *p = head;
    while (p != NULL) {
        printf("%s", p->clothing);
        p = p->next;
    }
}

int main() {
    node *head = create("clothing");
    print(head);
}

Ответы [ 3 ]

1 голос
/ 06 апреля 2019

Ваша create функция неверна:

  • вы не тестируете на потенциальный malloc отказ
  • вы не копируете строку, а просто вызываете неопределенное поведение, пытаясь записать в clothing[10], что находится за концом массива. Кстати, вы читаете ch[10], что тоже может быть за пределами. Вместо этого вам следует скопировать строку, избегая переполнения буфера, если ch слишком длинный.

Вот улучшенная версия:

#incude <string.h>
#incude <stdlib.h>

node *create(char const ch[]) {
    temp = malloc(sizeof(node));
    if (temp != NULL) {
        temp->next = NULL;
        temp->clothing[0] = '\0';
        strncat(temp->clothing, ch, sizeof(temp->clothing) - 1);
    }
    return temp;
}

Начиная с C99, существует способ выделения копии строки без ограничения ее размера и без необходимости отдельного выделения и указателя в структуре node. Это называется гибкий массив. Вот как это работает:

typedef struct node {
    struct node *next;
    char clothing[];
} node;

node *create(char const ch[]) {
    size_t size = strlen(ch) + 1;
    temp = malloc(sizeof(node) + size);
    if (temp != NULL) {
        temp->next = NULL;
        memcpy(temp->clothing, ch, size);
    }
    return temp;
}
0 голосов
/ 06 апреля 2019
node *addnode(node *after, const char *str)
{
    node *nptr;

    nptr = malloc(sizeof(*nptr));
    nptr -> partstr = malloc(strlen(str) + 1);
    /* error checking you need to add after every malloc */
    strcpy(nptr -> partstr, str);
    if(!after)
    {
        nptr -> prev = NULL;
        nptr -> next = NULL;
    }
    else
    {
        after -> next -> prev = nptr;
        nptr -> next = after -> next;
        after -> next = nptr;
        nptr -> prev = after;
    }
    return nptr;
}
0 голосов
/ 06 апреля 2019

Я передал узел функции print для печати строки, но ничего не печатается.

делает

temp -> clothing[10] = ch[10];

вы пишете (и можете читать) один символ из строки, максимальный индекс в temp -> clothing равен 9

вы хотите что-то вроде

strcpy(temp -> clothing, ch);

но будьте осторожны, чтобы не выйти за пределы поля одежда , потому что ch слишком длинный

так может быть

strncpy(temp -> clothing, ch, sizeof(temp -> clothing) - 1);
temp -> clothing[sizeof(temp -> clothing) - 1] = 0; /* useful if strlen(ch) >= 10 */

Вы уверены, что не хотите заменить char clothing[10]; на char * clothing;, чтобы этот предел не был равен 10?

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