我试图实现一种方法,将文件名输入到头部位置的列表中。一旦列表有第一个条目,在我第二次运行函数插入时,我想输入另一个文件名,但这次是在下一个(pNext)位置。
我知道如何在纸上做,但实施让我感到困惑。我能够第一次传递文件名。但是第二次尝试我创建了一个条件:if(frame-> pNext!= NULL){//应该添加到pnext位置
但是这个条件总是在我插入第一帧之前执行。 frame-> pNext是NULL,但由于我使用了malloc,它指向垃圾内存,因此条件总是为true,但我只需要在第一次运行时才为false。
这样我就在头部添加一个列表,然后在下一次运行时我在第二个位置添加第二个文件名....依此类推。
示例:filename:[first] [second] [third]
#include <crtdbg.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
typedef enum { FALSE = 0, TRUE } BOOL;
struct Frame {
char* fileName;
struct Frame* pNext;
};
struct Animation {
struct Frame* frames;
};
// Forward declarations
void initAnimation(struct Animation*);
void insertFrame(struct Animation*);
void runFrames(struct Animation*);
int main(void)
{
char response;
BOOL RUNNING = TRUE;
struct Animation A;
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
initAnimation(&A);
while (RUNNING)
{
printf("MENU\n 1. Insert a Frame\n 2. Delete all the Frames\n 3. Run the Animation\n 4. Quit\n");
scanf("%c", &response);
switch (response)
{
case '1':insertFrame(&A); break;
case '3':runFrames(&A); break;
case '4':RUNNING = FALSE; break;
default:printf("Please enter a valid option\n");
}
printf("\n");
while ((response = getchar()) != '\n' && response != EOF);// clear input buffer
}
return 0;
}
void initAnimation(struct Animation* pA) {
pA = NULL;
}
void insertFrame(struct Animation* pA) {
char* fileName;
struct Frame* frame;
fileName = (char *)malloc(sizeof(char)); //filename
frame = (struct Frame *)malloc(sizeof(struct Frame)); //next frame
frame->fileName = (struct Frame *)malloc(sizeof(struct Frame)); //filename
frame->pNext = (struct Frame *)malloc(sizeof(struct Frame)); //for next frames
printf("Insert a Frame in the Animation\n");
printf("Please enter the Frame filename :");
scanf("%s", fileName);
strcpy(frame->fileName, fileName); //store into filename
if (frame->pNext != NULL) { //add to pnext frame
printf("next frames");
frame->pNext = frame;
}
else { //add to first frame once
printf("this is the first frame");
pA->frames = frame;
}
}
答案 0 :(得分:1)
回答有关如何仅在添加第一个节点后运行条件的问题。您必须在"Parameters": {
"SSHKey": {
"Type": "String",
"Description": "Leave empty to disable SSH",
"Default": "",
"AllowedValues: ["","Project1Beanstalk","Project2Beanstalk"]
}
},
"Conditions": {
"EnableSSH": {
"Fn::Not": [
{
"Fn::Equals": [
"",
{
"Ref": "SSHKey"
}
]
}
]
}
之后将malloc移动到else语句中。在这方面,你应该注意一些事情。
首先,您缺少malloc所需的pA->frames = frame
库。
(来源:CLion,gcc错误)
其次,库stdlib.h
似乎是一个C ++库而不是一个C库(来源:轻谷歌搜索)。
第三,插入帧功能不存储正在创建的帧。这是因为变量A未被声明为指针。除此之外,当您在InsertFrame中初始化pNext时,您需要引用与crtdbg.h
相关的内容,if语句中的pA->frames
也是如此。
最后,您可以考虑添加一个指向第一个节点的头节点,以便您可以到达开头。
希望这会有所帮助,祝你好运
编辑: 我编写了我自己的insertFrame()函数版本:
frame->pNext = frame;
编辑2: 而不是使用initAnimation,我认为当你声明它时,在main中malloc它更有意义。如果不初始化它,或将其设置为NULL,则无处存储帧。