gpt4 book ai didi

c - 单链表C,打印

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:57 25 4
gpt4 key购买 nike

我是开发的初学者,所以我的老师给了我一个任务来完成,我需要在链表中输入几个字符串,在我输入 print 之后,它们需要以正确的顺序打印,从从头到尾。

这是我得到的:

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

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

char createlist(node *pointer, char data[100]) {
while (pointer->next != NULL) {
pointer = pointer->next;
}

pointer->next = (node*) malloc(sizeof(node));
pointer = pointer-> next;
pointer->data = *data;
pointer->next = NULL;
}

int main() {
node *first, *temp;
first = (node*) malloc(sizeof(node));
temp = first;
temp->next = NULL;

printf("Enter the lines\n");
while (1) {
char data[100];
gets(data);
createlist(first, data);
if (strcmp(data, "print") == 0)
printf("%s\n", first->data);
else if (strcmp(data, "quit") == 0)
return (0);

};

}

当我运行它时,我得到: 输入行: asdfasdf 打印 (空)

任何帮助将不胜感激,因为这是我第一次使用链表。

最佳答案

  • 您应该正确地格式化您的代码。
  • first->data 通过 malloc() 分配并且未初始化,因此使用它的值会调用未定义的行为
  • 为了不特别处理第一个元素,应该使用指向指针的指针让createlist()修改first
  • 由于 createlist() 不会返回任何内容,因此其返回值的类型应为 void
  • 我猜您想复制字符串而不是分配每个字符串的第一个字符。
  • 要打印您输入的所有内容,必须编写代码。
  • 您不应该使用 gets(),它有不可避免的缓冲区溢出风险。
  • 无论您通过 malloc() 分配什么,您都应该free()

改进的代码:

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

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

void createlist(node **pointer, char data[100])
{
while (*pointer != NULL)
{
pointer = &(*pointer)->next;
}

*pointer = malloc(sizeof(node));
if (*pointer == NULL)
{
perror("malloc 1");
exit(1);
}
(*pointer)->data = malloc(strlen(data) + 1);
if ((*pointer)->data == NULL)
{
perror("malloc 2");
exit(1);
}
strcpy((*pointer)->data, data);
(*pointer)->next = NULL;
}

int main(void)
{
node *first = NULL;

printf("Enter the lines\n");
while (1)
{
char data[100], *lf;
if (fgets(data, sizeof(data), stdin) == NULL) strcpy(data, "quit");
if ((lf = strchr(data, '\n')) != NULL) *lf = '\0'; /* remove newline character */
createlist(&first, data);
if (strcmp(data, "print") == 0)
{
node *elem = first;
while (elem != NULL)
{
printf("%s\n", elem -> data);
elem = elem->next;
}
}
else if (strcmp(data, "quit") == 0)
{
while (first != NULL)
{
node *next = first->next;
free(first->data);
free(first);
first = next;
}
return(0);
}

}

}

关于c - 单链表C,打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35751121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com