2016-04-28 10 views
0

Ich mache eine Übung auf verknüpften Listen und ich stieß auf ein Problem. Die verknüpfte Liste ist ein Tail, also möchte ich das Element löschen, das an erster Stelle über dem Wurzelknoten steht. Ich nicht möchte den Wurzelknoten in jedem Fall löschen. Der Code ist:.verknüpfte Liste Knoten nach Wurzel löschen

struct goods{ 
    char* section; 
    char* pname; 
    int value; 
    int customer_num; 
    int cash; 
    struct goods* next; 
}; 
void delete_goods(int customer_num,struct goods* root) 
{ 
struct goods *current=root; 
struct goods *previous=NULL; 
while(current!=NULL){ 
    if(current->customer_num == customer_num){ 
    if (previous==NULL){ 
     current=current->next; 
     free(root); 
    } 
    else { 
     previous->next=current->next; 
     free(current); 
     current=previous->next; 
    } 
    } 
    else{ 
    previous=current; 
    current=current->next; 
    } 
} 
} 
int main(){ 
    root = malloc(sizeof(struct goods)); 
    root ->next=NULL; 
    printf("give the number of starting customers\n"); 
    scanf("%d",&customers); 
    inform_list(customers);// adds element to list 



     else if(r=='r'&&customers!=0){ 
      printf("removing...\n"); 
      delete_goods(customers,root); 
      customers-=1; 
      printf("customers:\t%d\n",customers); 
      print(); 
     } 
     } 

Ich habe nicht den ganzen Code schreiben (es einige Funktionen enthält Elemente für das Hinzufügen Ihrer Bequemlichkeit zu verknüpfen Liste für Ich kann es tun, wenn Sie mögen muss ich meine Art und Weise Löschfunktion zu beheben so dass es die Anforderungen erfüllt, die ich oben erwähnt Hier ein Beispiel für die Ausgabe der Liste.
customers: 2 customer: 2 item value: 32 product name: asdasd customer: 1 item value: 43 product name: sdsad customer: 0 item value: 0 product name: (null) , was ich brauche, ist meine Löschfunktion entfernen Kunde 1, wenn dann gefragt, Kunde 2 usw.

+0

Wenn Sie nicht wollen, den Wurzelknoten „in jedem Fall löschen "Vielleicht ist es sinnvoll, die Traversierung bei' current = root-> next' und 'previous = root' zu beginnen. Sag es einfach. Das wird vorausgesetzt, dass "root" an erster Stelle korrekt auf NULL getestet wird (niemals nie sagen). Und angesichts Ihrer Einschränkung bin ich gedrängt zu sehen, warum "free (root);" überall in diesem Code vorhanden ist. – WhozCraig

+0

danke Whoz. der Grund, warum diese Anweisung 'if (previous == NULL) { current = current-> next; frei (Wurzel); } existieren in meinem Code ist, dass ich nicht entfernen konnte, ohne meine Löschungfunktion zu verursachen –

+0

Yeah ... Ich fürchte, dass Ihr schlauer Plan, eine offensichtlich falsche Sache zu tun, eine andere falsche Sache zu verhindern, ist Baldrick-würdig :( –

Antwort

1

Wie andere erwähnt haben, möchten Sie Bewahren Sie den Stammknoten auf, sodass Sie von root->next starten möchten (dh root wird immer nicht null sein).

Dies sollte funktionieren [bitte unentgeltlichen Stil Bereinigungs verzeihen]:

void 
delete_goods(int customer_num, struct goods *root) 
{ 
    struct goods *current = root->next; 
    struct goods *previous = NULL; 
    struct goods *next; 

    for (; current != NULL; current = next) { 
     next = current->next; 

     if (current->customer_num == customer_num) { 
      if (previous != NULL) 
       previous->next = next; 
      else 
       root->next = next; 

      free(current); 
     } 
     else 
      previous = current; 
    } 
} 

Hier ist eine etwas kompaktere Version:

void 
delete_goods(int customer_num, struct goods *root) 
{ 
    struct goods *current = root->next; 
    struct goods *previous = root; 
    struct goods *next; 

    for (; current != NULL; current = next) { 
     next = current->next; 

     if (current->customer_num == customer_num) { 
      previous->next = next; 
      free(current); 
     } 
     else 
      previous = current; 
    } 
} 
+0

Vielen Dank für Ihre Hilfe Craig –

+0

Gern geschehen, ich hoffe, dass die Technik der Einführung der 'next' Variablen zur Vereinfachung der Logik klar wurde [und warum sie benötigt wird]. –