2016-03-20 4 views
0

誰かが正しい方向に向いていますか? newNode1 -> next = head;C - コードは頭が宣言されていないと言っています - ノードをリンクリストに挿入しようとしています

typedef struct _node { 
    int data; 
    struct _node *next; 
} node_t; 

typedef struct { 
    node_t *head; 
    node_t *tail; 
} LL_t; 

//Post: inserts node with data x into location i of list L 
void spliceinto(LL_t *L, int x, int i) { 
    node_t *newNode1 = malloc(sizeof(node_t)); 
    newNode1->data = x; 
    newNode1->next = NULL; 
    if (i == 1) { 
     newNode1->next = head; 
     head = newNode1; 
     return; 
    } 
    node_t *newNode2 = head; 
    for (int j = 0; j < i - 2; i++) { 
     newNode2 = newNode2 -> next; 
    } 
    newNode1->next = newNode2->next; 
    newNode2->next = newNode1; 
} 
+1

です。メッセージはかなり明確です、それについて考えてみてください! arrow-operatorの周りに空白を入れないと、コードが読みやすくなります。 – Olaf

+0

さて、エラーが発生しました。コードを見て、それは間違っています...参照されている場所は未定義です。 –

+1

あなた自身に尋ねます - あなたのコードで宣言された 'head'という変数はどこにありますか? – kaylum

答えて

1

書き込み

newNode1 -> next = L->head; 
L->head = newNode1; 

は、機能が無効であることを考慮してください:エラーがheadは、この行で宣言されていないと言います。例えば、一般的にはnewNode2->nextはNULLに等しいことができます。結果としてこのループ

for (int j = 0; j < i-2; i++){ 
    newNode2 = newNode2 -> next; 
} 

ノードの数がiより小さい場合、未定義の動作をすることができます。

そして、タイプミス

for (int j = 0; j < i-2; i++){ 
         ^^^^ 

が存在しなければならないj++があります。

また、tailが変更された場合は、関数内でtailを更新することを忘れないでください。

ここには、どのように機能を記述できるかを示すデモンストリアルプログラムがあります。

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

typedef struct _node 
{ 
    int data; 
    struct _node * next; 
} node_t; 

typedef struct 
{ 
    node_t * head; 
    node_t * tail; 
} LL_t; 

void spliceinto(LL_t *ll, int i, int x) 
{ 
    node_t *newNode = malloc(sizeof(node_t)); 

    if (newNode != NULL) 
    { 
     newNode->data = x; 

     if (i == 1 || ll->head == NULL) 
     {    
      newNode->next = ll->head; 
      ll->head = newNode; 
      if (ll->head->next == NULL) ll->tail = ll->head; 
     } 
     else 
     { 
      node_t *current = ll->head; 
      for (int j = 0; j < i - 2 && current->next != NULL; j++) 
      { 
       current = current->next; 
      } 

      newNode->next = current->next; 
      current->next = newNode; 
      if (newNode->next == NULL) ll->tail = newNode; 
     } 
    } 
}  

void display(LL_t *ll) 
{ 
    for (node_t *current = ll->head; current != NULL; current = current->next) 
    { 
     printf("%d ", current->data); 
    }   
    printf("\n"); 
}  

int main(void) 
{ 
    LL_t ll = { NULL, NULL }; 

    for (int i = 0; i < 10; i += 2) spliceinto(&ll, i + 1, i); 
    for (int i = 1; i < 10; i += 2) spliceinto(&ll, i + 1, i); 

    display(&ll); 
}  

プログラムの出力は、それは可能性が高いことを言って、コンパイラの

0 1 2 3 4 5 6 7 8 9 
関連する問題