链接字符串列表C / Struct

时间:2013-12-26 16:31:47

标签: c string function struct linked-list

我要创建一个LinkedList,它具有在其中添加和打印字符串的功能。

在下面附上我的代码。

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

struct Line {
       char tekst[20];
       struct Line *next;
};

void print(const struct Line* n);
void add(struct Line* n, char t[20], struct Line* next);

int main(void) {
    struct Line lin, *tekst;
    tekst = NULL;
    add(&lin, "ExampleString1", tekst);
    add(&lin, "ExampleString2", tekst);
    print(&lin);

    getch();
    return 0;  
};

void print(const struct Line* n) {
     for ( ; n; n = n->next )
         printf("%s", n->tekst);
     printf("\n");
}

void add(struct Line* n, char t[20], struct Line* next) {
     strcpy(n->tekst,t); // before: n->tekst[20] = t[20];
     n->next = next;
}

它在标准输出上写入一些随机数,然后崩溃命令行。 我不知道tekst2[20]是否应该在这里(我不知道如何在这里调用我的函数参数)。

我的目标是制作一个字符串列表,然后才能添加和打印它们。

2 个答案:

答案 0 :(得分:1)

我几乎可以肯定这就是你要做的事情:

void add(struct Line** pp, const char *t)
{
    struct Line *p = malloc(sizeof(*p));
    strcpy(p->tekst, t);
    p->tekst2[0] = 0;
    p->next = NULL;

    while (*pp)
        pp = &(*pp)->next;
    *pp = p;
}

您的print()函数使用了错误的格式说明符来打印字符串:

void print(const struct Line* n) 
{
     for ( ; n; n = n->next )
         printf("%s\n", n->tekst);
     printf("\n");
}

将它放在main()

int main(void)
{
    struct Line *lst = NULL;

    add(&lst, "SomeTxt");
    add(&lst, "SomeMoreTxt");
    add(&lst, "YetMoreTxt");

    print(lst);

    getch();
    return 0;  
};

<强>输出

SomeTxt
SomeMoreTxt
YetMoreTxt

我留下正确的清单代码以及正确的错误检查作为您的任务。

如何运作

此功能使用“指向指针”的习语。当您从&lst传递main()时,您将传递指针变量的地址。指针只不过是地址保存到东西的变量(当然是它所声明的指针类型)。例如:

int a;
int *b = &a;

声明指向int的指针,并指定int地址以存储在其中。另一方面,这个:

int a;
int *b = &a;
int **c = &b;

声明我们之前的内容,但c被声明为指向指针指向的指针。就像我们在int中存储b的地址一样,请注意我们如何在int*中存储c的地址。这是该语言的非常强大的功能。

那就是说,代码的工作原理如下:

void add(struct Line** pp, const char *t)
{
    // node allocation stuff. nothing special here
    struct Line *p = malloc(sizeof(*p));
    strcpy(p->tekst, t);
    p->tekst2[0] = 0;
    p->next = NULL;

    // look at the pointer addressed by our pointer-to-pointer pp
    //  while it is not null, store the address of the `next` pointer 
    //  of that node in pp and loop.
    while (*pp)
        pp = &(*pp)->next;

    // pp now holds the address of the pointer we want to set with our new node
    //  it could be the address of the original pointer passed in (if the list was
    //  empty). or the address of some `next` member in the list. We really don't 
    //  care which. All we care about it is it addresses the pointer we need to 
    //  assign our new allocation to, so that is what we do.
    *pp = p;
}

花一些时间在网上研究C和指针指针。它们将改变您对列表管理等内容的思考方式。要记住的最重要的事情是指向指针的指针 not 指向某个“节点”的指针;它指向指向节点的指针。这是一个非常令人兴奋的声明,但做一些功课,这将是有道理的。

答案 1 :(得分:0)

已修改:使用以下行(或strncpystrcpy(n->tekst,t);代替n->tekst[20] = t[20];

将* test初始化为null

struct Line lin, *tekst=NULL;

使用%s在程序中打印文本。

printf("%s", n->tekst);