2017-09-18 8 views
-1

ファイル名を先頭の位置にリストに入力する方法を実装しようとしています。リストに最初のエントリがあると、関数insert内の2回目の実行で別のファイル名を入力しますが、今回は次の(pNext)位置に入力します。Cリンクリストの条件文

私は紙の上でそれを行う方法について考えていますが、その実装は私を混乱させます。私は最初にファイル名を渡すことができます。しかし、2番目の試行では条件を作成しました:if(frame-> pNext!= NULL){// // pnext位置に追加する必要があります

しかし、この条件は常に最初のフレームを挿入する前に実行されます。 frame-> pNextはNULLですが、私はmallocを使用して以来、ガベージメモリを指しているため、条件は常に真ですが、最初の実行時にはfalseにする必要があります。

このようにして、先頭にリストを追加し、次に実行すると、2番目のファイル名が追加されます。

例:ファイル名:[最初] [二] [三]

#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; 
    } 
} 
+2

このコードの大部分は間違いありません。私がすぐに言うことができるのは、4つの 'malloc'の実行が非常に疑わしいことだけです。おそらく2つしか必要ではないでしょうし、確かにそのうちの1つを1バイトにしたくないでしょう。 –

+0

@DavisHerringただ1バイトで何を意味していますか? –

+0

'sizeof(char)'は1になるように定義されています。 –

答えて

1

最初のノードが追加された後の状態でのみ実行させる方法についてのあなたの質問に答えるために。 pA->frames = frameの後に、mallocをelseステートメントに移動する必要があります。そのメモには、あなたが知っておくべきことがいくつかあります。

まず、mallocに必要なライブラリstdlib.hがありません。 (ソース:Clion、gccエラー)

第2に、ライブラリcrtdbg.hは、Cライブラリ(ソース:軽いGoogle検索)ではなくC++ライブラリのようです。

第3に、挿入フレーム関数は、作成されているフレームを格納していません。これは、変数Aがポインタとして宣言されていないためです。この点に加えて、InsertFrameでpNextを初期化するときには、pA->framesを基準にして参照する必要があります。ifステートメントのframe->pNext = frame;も同じです。

最後に、先頭に到達できるように最初のノードを指すヘッドノードを追加することをお勧めします。編集2

void insertFrame(struct Animation* pA) { 
struct frame* frame; 

frame = (struct frame *)malloc(sizeof(struct frame)); //next frame 
frame->fileName = (char*)malloc(sizeof(char)); //filename 


printf("Insert a Frame in the Animation\n"); 
printf("Please enter the Frame filename :"); 
scanf("%s", frame->fileName); 

//Skips to else the first time because pA->frames->pNext == Null 
//The extra if is how I stopped a segmentation fault. 
if(pA->frames != NULL) { 

    //Check if the current node has memory space reserved 
    if (pA->frames->pNext != NULL) { //add to pnext frame 
     printf("next frames\n"); 
     pA->frames->pNext = frame; 
     pA->frames = pA->frames->pNext; 
    } 
} 
else { //add to first frame once 
    printf("this is the first frame\n"); 

    //fill the first frame 
    pA->frames = frame; 

    //Set head node next value to the first node in the list 
    pA->head->pNext= pA->frames; 

    //Because pA->frames->pNext is declared and initialilzed here, it keeps 
    //the if statement above from running the first time 
    pA->frames->pNext = (struct frame *)malloc(sizeof(struct frame)); 
} 
} 

:私はあなたのInsertFrameを()関数の私の独自のバージョンを書いた :代わりにinitAnimationを使用しての 、私はそれがよりになると思いますこれは、幸運

編集を助け

・ホープあなたがそれを宣言したときにメインでmallocすることを意味します。初期化しないか、NULLに設定すると、フレームを格納する場所がありません。

+0

ifステートメントの前にmallocをインクリメントします。例外がスローされます。読み取りアクセス違反 フレームは0XCCCCCCCC –

+0

どのようにn番目の位置に追加して、そのフレームに既に存在するフレームがあればスワップできますか?基本的に<= n番目の位置にフレームを配置することはできません –