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