我要创建一个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]
是否应该在这里(我不知道如何在这里调用我的函数参数)。
我的目标是制作一个字符串列表,然后才能添加和打印它们。
答案 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)
已修改:使用以下行(或strncpy
)strcpy(n->tekst,t);
代替n->tekst[20] = t[20];
将* test初始化为null
struct Line lin, *tekst=NULL;
使用%s在程序中打印文本。
printf("%s", n->tekst);