2017-04-15 1 views
1

Ich schrieb den folgenden Code, aber es funktioniert nicht mehr nach dem Ausführen der create() -Funktion. Ich möchte alternative Elemente löschen, die vom Hauptknoten ausgehen. Ist meine Funktion delete_Alt() korrekt? Bitte sag mir wo ich falsch liege.Wie löscht man alternative Knoten in einer doppelt verknüpften Liste in C?

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

// using a structure 
typedef struct mynode { 
    int data; 
    struct mynode *prev; // to point to previous node 
    struct mynode *link; // to point to next node 
} node; 
node *head = NULL; 

// creating the list 
void create() { 
    node *p, *q; 
    int ch; 
    do { 
     p = (node *)malloc(sizeof(node)); 
     printf("enter data\n"); 
     scanf("%d", &p->data); 
     if (head == NULL) 
     { 
      p->prev = head; 
      q = p; 
     } 
     else 
     { 
      p->prev = q; 
      p->link = NULL; 
      q->link = p; 
      q = p; 
     } 
     printf("create another node?, press 1 "); 
     scanf ("%d",&ch); 
    } while(ch==1); 
} 

//to delete alternate elements 
void delete_Alt() { 
    if (head == NULL) 
     printf("Empty list...ERROR"); 

    node *previous, *current, *next;  
    previous = head; 
    current = head->link; 
    while (previous !=NULL && current != NULL) { 
     previous->prev = current->prev; 
     previous->link = current->link; 

     next = current->link; 
     previous->link = next; 
     next->prev = previous; 

     free(current); 
    } 
} 

// print the list 
void display() { 
    node *temp; 
    temp = head; 
    while (temp != NULL) { 
     printf("%d ",temp->data); 
     temp = temp->link; 
    } 
    printf("\n"); 
} 

int main() { 
    node *head = NULL; 
    create(); 
    printf("List before deleting is: "); 
    display(); 
    delete_Alt(); 
    printf("List after deleting is:  "); 
    display(); 
return 0; 
} 
+0

Denken Sie über den Wert von 'current' (die Adresse, die es enthält) in der Lebensdauer Ihrer' while' Schleife. Sie legen es * einmal * vor der Schleife fest. Es wird nie wieder verändert, aber es ist sowohl dereferenziert als auch wiederholt "frei". Das kann * möglicherweise * nicht stimmen. Es ist auch sehr verdächtig, dass, wenn der erste Knoten, auf den "head" zeigt, der erste ist, der freigegeben wird, warum ändert sich die Adresse in "head" nie? Ein * erwarteter * Input/Output-Sample würde diese Frage tun, übrigens. – WhozCraig

Antwort

0

In Ihrem Programm zugewiesen Sie einen Wert nur einmal den Kopf:

node *head = NULL; 

Dann seinen Wert nicht ändert.

0

Sie haben dem ersten erstellten Element in der Liste nie "head" zugewiesen. Daher ist es immer Null. Versuchen Sie folgendes:

if (head == NULL) 
{ 
    p->prev = head; 
    head = p;  
    q = p; 
} 

In Ihrem delete_alt, müssen Sie dies tun:

while (previous !=NULL && current != NULL) { 
    previous->link = current->link; 
    next = current->link; 
    free(current); 
    if(next) { 
     next->prev = previous; 
     current = next->link; 
    } 
    else current = NULL; 
    previous = next; 
} 

es versuchen hier: https://repl.it/HK2P/0

1

Sie erstellen sowie in Löschfunktion einige kleine Fehler machen ...

Hier ist der aktualisierte Code versuchen sie es ...

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

// using a structure 
typedef struct mynode { 
    int data; 
    struct mynode *prev; // to point to previous node 
    struct mynode *link; // to point to next node 
} node; 
node *head = NULL; 

// creating the list 
void create() { 
    node *p, *q; 
    int ch; 
    do { 
     p = (node *)malloc(sizeof(node)); 
     printf("enter data\n"); 
     scanf("%d", &p->data); 
     p->link = NULL; 
     if (head == NULL) 
     { 
      p->prev = NULL; 
      head = p; 
     } 
     else 
     { 
      q = head; 
      while (q->link != NULL) 
      q = q->link; 
      p->prev = q; 
      q->link = p; 
     } 
     printf("create another node?, press 1 "); 
     scanf ("%d",&ch); 
    } while(ch==1); 
} 

//to delete alternate elements 
void delete_Alt() { 
    if (head == NULL) 
     printf("Empty list...ERROR"); 

    node *previous, *current, *next;  
    previous = head; 
    current = head->link; 
    while (previous !=NULL && current != NULL) 
    { 
     previous->link = current->link; 
     next = current->link; 
     free(current); 
     if(next) 
     { 
      next->prev = previous; 
      current = next->link; 
     } 
     else 
     current = NULL; 
     previous = next; 
    } 
} 

// print the list 
void display() { 
    node *temp; 
    temp = head; 
    while (temp != NULL) { 
     printf("%d ",temp->data); 
     temp = temp->link; 
    } 
    printf("\n"); 
} 

int main() { 
    node *head = NULL; 
    create(); 
    printf("List before deleting is: "); 
    display(); 
    delete_Alt(); 
    printf("List after deleting is:  "); 
    display(); 
return 0; 
} 
Verwandte Themen