2016-03-20 18 views
0

Birisi bana doğru yönde işaret edebilir mi? Hata head bu satırda bildirilmeyen diyor: işlev geçersiz olduğunuC - Kod, başlığın bildirilmemiş olduğunu gösteriyor - bağlantı listesine bağlı düğüm eklemek istiyor

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

dikkate alın newNode1 -> next = head;

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

O daha muhtemel olduğunu söyleyerek derleyici olmasıdır. Mesaj oldukça açık, düşün! Ok operatörü etrafında boşluk eklememek, kodunuzu daha iyi okunabilir hale getirir. – Olaf

+0

Eh, err .. koda baktığımızda, burada ... referanslandığı yerde tanımlanmamış. –

+1

Kendinize sorun - kodunuzda "head" olarak adlandırılan değişken nerede? – kaylum

cevap

1

Yaz. Örneğin genel olarak newNode2->next NULL'e eşit olabilir. düğüm sayısı i daha az olduğunda Sonuç olarak, bu döngü

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

tanımsız davranış sahip olabilir.

Ve bir yazım hatası

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

olmalı j++ yoktur.

Ayrıca, tail değiştirildiyse, tail işlevini de güncellemeyi unutmayın.

İşte işlevin nasıl yazılacağını gösteren bir programdır.

#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); 
}  

programı çıkışı

0 1 2 3 4 5 6 7 8 9