【发布时间】:2020-10-01 05:09:31
【问题描述】:
我需要编写从用户那里获取结构(姓名、路径和时间)的软件,然后将结构添加到链表的末尾。我写了两个函数来解决它只在第一次运行时才起作用的问题,如果用户试图向链接程序添加另一个结构,程序就会崩溃): 谁能帮我理解问题是什么? 谢谢! 这些是我创建的结构:
// Frame struct
typedef struct Frame
{
char* name;
int duration;
char* path;
} Frame;
// Link (node) struct
typedef struct FrameNode
{
Frame* frame;
struct FrameNode* next;
} FrameNode;
有什么功能:
FrameNode* addFrame(Frame frame)
{
FrameNode* p = malloc(sizeof frame);
printf("*** Creating a new frame ***\n");
printf("Please insert frame path:\n");
p->frame->path = (char*)malloc(sizeof(char*) * 100);
fgets(p->frame->path, 100, stdin);
p->frame->path[strcspn(p->frame->path, "\n")] = 0;
printf("Please insert frame duration <in miliseconds>:\n");
scanf_s("%d", &(p->frame->duration));
getchar();
printf("Please chooce a name for a new frame:\n");
p->frame->name = (char*)malloc(sizeof(char*) * 100);
fgets(p->frame->name, 100, stdin);
p->frame->name[strcspn(p->frame->name, "\n")] = 0;
while (list != NULL)
{
while (strcmp(list->frame->name, p->frame->name) == 0)
{
printf("The name is already taken, Please enter another name\n");
fgets(p->frame->name, 100, stdin);
}
}
p->next = NULL;
return p;
}
FrameNode* insertAtEnd(FrameNode* list, Frame fr)
{
FrameNode* tmp = addFrame(fr);
if (list != NULL)
{
list = list->next;
}
list = tmp;
return list;
}
【问题讨论】:
-
请提供minimal reproducible example 来证明您的问题。
-
insertAtEnd没有将框架节点添加到列表的末尾。它将它添加为列表中的第一项或第二项,失去指向原始第二项(如果有)的链接。 -
如果
list != NULL为真,addFrame中的while (list != NULL)循环将是一个无限循环。 -
@אבילוי 您的新版本
insertAtEnd不会在列表中附加任何内容。它只是将添加的框架节点作为新列表返回。 -
addFrame对其参数frame没有任何作用(除了评估sizeof(frame)无论如何都是不正确的)。