2017-02-24 2 views
-1

Ich versuche, ein einfaches Programm zu schreiben, um einen Knoten in eine verkettete Liste einzufügen. Hier ist, wie es aussieht:Pause verursacht Laufzeitfehler

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

typedef struct 
{ 
    int data; 
    struct Node *next; 
}Node; 

void insert (Node **head, int data, int pos) 
{ 
    Node *left, *right, *newNode; 
    newNode = (Node *)malloc(sizeof(Node)); 
    int i; 

    newNode->data = data; 
    right = *head; 
    if (pos == 0) 
    { 
     newNode->next = right; 
     *head = newNode; 
    } 
    else 
    { 
     for (i = 0; i<pos; i++) 
     { 
      left = right; 
      right = right->next; 
      if (right->next == NULL) 
      { 
       //break; 
      } 
     } 
     if (i == pos) 
     { 
      left->next = newNode; 
      newNode->next = right; 
     } 
     else 
     { 
      printf("Cannot insert at the given position"); 
     } 
    } 
} 

void printLinkedList (Node *head) 
{ 
    while(head != NULL) 
    { 
     printf("%d\t", head->data); 
     head = head->next; 
    } 
    printf("\n"); 
} 

int main(void) { 
    Node *head = NULL; 
    insert(&head, 1, 0); 
    printLinkedList(head); 
    //insert(&head, 2, 5); 
    //printLinkedList(head); 
    insert(&head, 2, 1); 
    printLinkedList(head); 
    insert(&head, 3, 1); 
    printLinkedList(head); 
    insert(&head, 4, 3); 
    printLinkedList(head); 
    return 0; 
} 

Alles funktioniert gut mit dieser Ausnahme der break-Anweisung im if (rechts-> nächste == NULL) Schleife. Ich möchte das hinzufügen, wenn die Eingabeposition ein Wert ist, der größer ist als die Länge der verknüpften Liste, dann breche ich einfach und drucke, dass wir keinen Knoten an dieser gegebenen Position einfügen können. Aber irgendwie gibt mir diese break-Anweisung einen Laufzeitfehler.

Was mache ich hier falsch?

Edit: Danke für die Eingänge Dieses es fest:

for (i = 0; i<pos; i++) 
{ 
    if (right == NULL) 
    { 
     break; 
    } 
    left = right; 
    right = right->next; 
} 

Antwort

1

Es ist nicht der Bruch, der Absturz ist. Es ist die if (right->next == NULL), die zusammenbricht. Der einzige Grund dafür, dass der Abbruch nicht zum Absturz führt, ist, dass der Compiler den leeren if-Block entfernt. Der Grund für den Absturz der Anweisung ist, dass das Recht NULL ist. Daher ist es nicht zulässig, es zu dereferenzieren.

Die Ursache des Problems ist, dass Sie rechts -> nächste direkt nach rechts = rechts -> nächste überprüfen, so dass Sie im Grunde über jedes andere Element überspringen.

+0

Ich versuchte dies und fügte hinzu: if (rechts-> nächste == NULL) { NOTFOUND = 1; } } if (NOTFOUND) { links-> next = newNode; newNode-> next = rechts; } Die Dinge funktionieren immer noch ... Ich sehe einen Fall, wenn rechts könnte NULL sein (Vielleicht, wenn ich versuche, in eine leere verkettete Liste mit einer Position einfügen, die nicht 0 ist), aber mit meinem aktuellen Beispiel in main.c sollte es idealerweise brechen bevor das Recht NULL wird –

1
If(right==NULL) 

Statt

If(right->next==NULL) 

Das sollte funktionieren. Da Sie bereits den rechten Zeiger zum nächsten bewegt haben, ist der rechte Zeiger möglicherweise NULL.

Oder besser

left = right; 
If(right->next == NULL) 
    break; 
right = right->next;