字符串单链表在C中的实现



我想在每个节点中创建一个包含字符串的单链列表,而不是整数。

但是,我无法执行它。有人能告诉我执行过程中出了什么问题吗?

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct node {
char data;
struct node* next;
};
struct node* create(struct node* head, const char* data) {
struct node* newnode, * temp;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->data = data;
newnode->next = NULL;
if (head == NULL) {
head = newnode;
temp = newnode;
}
else {
temp->next = newnode;
temp = temp->next;
}
temp->next = NULL;
return head;
}
struct node* display(struct node* head) {
struct node* temp;
temp = head;
while (temp != NULL) {
printf("%d->", temp->data);
temp = temp->next;
}
printf("NULL");
return head;
}
int main() {
struct node* head;
head = NULL;
int size, i;
char str[5];
printf("nSize of linked list you want: ");
scanf("%d", &size);
for (i = 0; i < size; i++) {
gets(str);
head = create(head, str);
}
display(head);
return 0;
}

char data包含一个字符。这不是你想要的,对吧?您想要保存字符串,即指向第一个字符的指针:

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

这通过一个指针来保存字符串-不清楚您是希望这个指针是一个拥有指针(即,如果节点消失,那么字符串也会消失(,还是一个引用(即,其他人拥有字符串并管理其生存期(。

还有其他错误,但这将是一个很好的起点。启用编译器发出的所有警告,并理解它们,因为如果你的代码中有大多数是C语言允许的错误(因为它不能确定你真正想要的是什么(,但这并不意味着代码是正确的。

另一种保存字符串的方法可能是通过值来,也就是说,你可以保存一个数组,而不是像你在答案中那样只有一个字符-关于如何做到这一点,请参阅这个问题的另一个答案。在介绍性教学代码中,通过指针拥有字符串与将其作为值拥有字符串之间的选择并不重要,因为在介绍性学习代码中,您不会在实际用例中衡量数据结构的性能。所以没有";一个真正的选择":在某些用例中,每一个都有好处。

一些模糊的建议(总是要经过测量!(可能是:

  • 如果值是常数,那么按固定大小或可变大小的值保持字符串通常会在性能中获胜

  • 如果这些值的大小范围很小(例如,所有字符串都是"短"(,那么拥有一个固定大小的节点并将其分配到一个连续的内存池中可以提高的性能

  • 如果值发生变化,则按值保存字符串并不总是可行的:可能需要重新分配节点以调整其大小,然后需要一个双链表来调整相邻节点的指针,以反映节点的新地址

  • 最通用且可能性能最差的选项是通过所属指针保持字符串,因此节点可以保持在固定地址,但字符串可以移动;在这种情况下,如果有很多小字符串,则小字符串优化可能会进一步改进:如果字符串适合节点的固定大小的char数组,则将其保留在其中,但在其他情况下将其分配到单独的内存块中;这是在std::string的实现中通常要做的事情,它提高了性能。这种想法是,由于字符串是";"大";,那么,与使用该字符串的实际值所做的任何工作相比,必须引用某个其他地址才能获取其数据的开销将是微不足道的。

有几个问题:

  • 结构中需要一个char数组,而不是cchar
  • create函数过于复杂且错误

OTOH您的display功能是正确的。

你想要这个:

有关解释,请查看评论。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSTRINGSIZE 100                  // maximum allowed size of strings
struct node {
char data[MAXSTRINGSIZE];                // we need an array of char her, not a char
struct node* next;
};
struct node* create(struct node* head, const char* data) {
struct node* newnode = malloc(sizeof(struct node));   // no cast is needed with malloc
strcpy(newnode->data, data);             // copy the string
newnode->next = head;  
return newnode;
}
struct node* display(struct node* head) {
struct node* temp;
temp = head;
while (temp != NULL) {
printf("%s->", temp->data);
temp = temp->next;
}
printf("NULL");
return head;
}
int main() {
struct node* head;
head = NULL;
int size;
char str[MAXSTRINGSIZE];
printf("nSize of linked list you want: ");
scanf("%d", &size);
getchar();             // absorb n, scanf and gets don't mix well
for (int i = 0; i < size; i++) {
gets(str);
head = create(head, str);
}
display(head);
return 0;
}

票据

  • 您可以有一个指针,只分配存储字符串所需的内存量,而不是在结构中有一个固定大小的data成员。我让你自己想办法
  • 您应该使用fgets,而不是gets(这是一个不推荐使用的函数(。阅读本文了解更多信息

相关内容

  • 没有找到相关文章

最新更新