2016-07-29 7 views
1

Angesichts einer einfach verknüpften Liste und einer Position versuche ich einen verknüpften Listenknoten an einer bestimmten Position zu löschen. Code:Löschen eines Knotens an einer bestimmten Position in der verknüpften Liste

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

struct node 
{ 
    int data; 
    struct node* next; 
}; 

void printList(struct node* head_ref) 
{ 
    //struct node* head_ref = (struct node*)malloc(sizeof(struct node)); 

    if(head_ref == NULL) 
    printf("The list is empty"); 

    while(head_ref!=NULL) 
    { 
     printf("%d\n",head_ref->data); 
     head_ref = head_ref->next; 
    } 
} 

void insert_beg(struct node **head_ref,int new_data) 
{ 
    struct node* new_node = (struct node*)malloc(sizeof(struct node)); 
    new_node->data = new_data; 
    new_node->next = *head_ref; 
    *head_ref = new_node; 
} 

void delete(struct node **head_ref,int position) 
{ 
    int i=1; 
    if(*head_ref == NULL) 
    return; 

    struct node *tails,*temp = *head_ref; 
    if(position == 0) 
    { 

     *head_ref = temp->next; 
     free(temp); 
     return; 
    } 

    while(temp->next!=NULL) 
    { 
     tails = temp->next; 
     temp = temp->next; 

     if(i == position) 
     { 
      tails->next = temp->next; 
      free(temp); 
      return;  
     } 

     i++; 
    } 

} 

int main() 
{ 
    struct node *head = NULL; 
    insert_beg(&head,36); 
    insert_beg(&head,35); 
    insert_beg(&head,34); 
    insert_beg(&head,33); 

    printList(head); 
    int position; 
    printf("Enter the position of the node u wanna delete\n"); 
    scanf("%d",&position); 

    delete(&head,position); 
    printf("\n"); 
    printList(head); 
} 

Immer, wenn ich 0 einen Knoten über Position zu löschen versuchen, erhalte ich 0 in dieser bestimmten Position anstelle von nichts. Kann ich wissen, wo ich falsch liege? Für zB meine Liste ist: 33 34 35 36 My Ausgang: 33 0 35 36 (während versucht Knoten 1 zu löschen) gültige Ausgabe: 33 35 36

Antwort

0

Das Problem tritt aufgrund dieser falschen Aussage

while(temp->next!=NULL) 
{ 
    tails = temp->next; 
    ^^^^^^^^^^^^^^^^^^^ 
    temp = temp->next; 

In diesem Fall Schwänze und Temperatur sind die gleichen Knoten. Und wenn Temp gelöscht wird dann legen Sie das Datenelement neben der gelöschten Knoten> TEMP- nächsten

if(i == position) 
    { 
     tails->next = temp->next; 
     ^^^^^^^^^^^^^^^^^^^^^^^^^ 

Hier Schwänzen ist der Knoten, die gelöscht werden soll.

Sie sollten das Datenelement neben dem Knoten vor dem gelöschten Knoten ändern. So ist die falsche Anweisung sollte wie

while(temp->next!=NULL) 
{ 
    tails = temp; 
    ^^^^^^^^^^^^^ 
    temp = temp->next; 

Was mich aktualisiert werden, dann würde ich die Funktion die folgende Art und Weise

int delete(struct node **head, size_t position) 
{ 
    struct node *prev = NULL; 

    size_t i = 0; 

    while (i != position && *head != NULL) 
    { 
     prev = *head; 
     head = &(*head)->next; 
     ++i; 
    } 

    int success = *head != NULL; 

    if (success) 
    { 
     struct node *tmp = *head; 

     if (prev == NULL) 
     { 
      *head = (*head)->next; 
     } 
     else 
     { 
      prev->next = (*head)->next; 
     } 

     free(tmp); 
    } 

    return success; 
} 
schreiben
0

In deiner Löschfunktion while loop tails und temp vorwärts bewegen a die gleiche Zeit beginnt von der gleichen Adresse. Der Knoten wird nicht gelöscht, da Sie immer den gleichen Wert zuweisen (dh Sie bestätigen nur den nächsten Zeigerwert jedes Mal).

Das bedeutet, dass der Ausdruck nach Ihrer Stornierung aufgrund des free d-Speichers eines der Knoten UB ist.

Correcting Code:

void delete(struct node **head_ref,int position) 
{ 
    int i=1; 
    if(*head_ref == NULL) 
    return; 

    struct node *temp = *head_ref; 
    if(position == 0) 
    { 
     *head_ref = temp->next; 
     free(temp); 
     return; 
    } 

    struct node *tails = *head_ref; 

    while(temp->next!=NULL) 
    { 
     temp = temp->next; 

     if(i == position) 
     { 
      tails->next = temp->next; 
      free(temp); 
      return; 
     } 

     tails = tails->next; 

     i++; 
    }  
} 
Verwandte Themen