创建字符串的链接列表

时间:2019-04-06 15:36:42

标签: c string linked-list

我是数据结构和链表的新手。 我正在使用C中的树进行名为 Amazon产品可用性检查器”的项目。所以我想在树的每个节点中存储字符串,但是在存储字符串时,代码没有显示任何错误,但是输出也没有得到打印。我已经通过节点打印功能来打印字符串,但是没有打印任何内容。

我只共享了一个字符串和一个节点的代码。我正在研究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 个答案:

答案 0 :(得分:1)

您的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;
}

答案 1 :(得分:0)

  

我已经通过节点打印功能来打印字符串,但是什么也没打印。

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

您在字符串中写入了(并且可能被读取)了一个字符,temp -> clothing中的最大索引为9

您想要类似的东西

strcpy(temp -> clothing, ch);

但是要注意不要走在 clothing 之外,因为 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吗?

答案 2 :(得分:0)

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