C链表条件语句

时间:2017-09-18 00:39:22

标签: c

我试图实现一种方法,将文件名输入到头部位置的列表中。一旦列表有第一个条目,在我第二次运行函数插入时,我想输入另一个文件名,但这次是在下一个(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;
    }
}

1 个答案:

答案 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,则无处存储帧。