2016-04-07 10 views
0

In der Laborarbeit, die ich mache, soll es einem Benutzer ermöglichen, Zeichenfolgen in eine verkettete Liste einzeln einzugeben, bis der Benutzer keine Zeichenfolge eingibt. An dieser Stelle vergleicht das Programm jede Zeichenfolge mit dem ersten Buchstaben, alphabetisiert sie und zeigt sie dann an.Eine verkettete Liste zum Alphabetisieren von Strings

Ich weiß, ich muss Strcmp verwenden, um zwei Strings auf einmal zu vergleichen, ich habe versucht, dies zu verstehen, aber es ist nur so kompliziert.

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

#define StringLengthMAX 80 

struct node_link 
{ 
    //char node_string[StringLengthMAX]; 
    int num; 
    struct node_link *next; 
}; 

int compare_node(struct node_link *b1, struct node_link *b2) 
{ 
    //strcmp(*b1, *b2); 


    if (b1 -> num < b2 -> num) 
    { 
     return -1; 
    } 
    if (b1 -> num == b2 -> num) 
    { 
     return 0; 
    } 
    if (b1 -> num > b2 -> num) 
    { 
     return 1; 
    } 
} 

struct node_link *add_node(struct node_link *list, struct node_link *node) 
{ 
    struct node_link *cur_node=list; 

    //case 1 : When list->num > node->num 
    if (compare_node(list, node) == 1) 
    { 
     node -> next = list; 
     list = node; 
     return list; 
    } 
    // case 2 

    while(cur_node->next != NULL) 
    { 
     if (compare_node(cur_node->next,node) == 1) 
     { 
      node -> next = cur_node -> next; 
      cur_node->next = node; 
      break; 
     } 
     else 
     { 
       cur_node = cur_node -> next; 
     } 
    } 
    // case 3 : node->next is the greatest 
    if (cur_node -> next == NULL) 
    { 
     cur_node->next = node; 
    } 
    return list; 
} 

void display_newlist(struct node_link *head) 
{ 
    struct node_link *node=head; 
    while(node != NULL) 
    { 
     printf("%d", node->num); 
     node = node->next; 
     printf(" "); 
    } 
} 

int main() 
{ 
    int a; 
    struct node_link *head; 
    struct node_link *node; 

    node = (struct node_link*)malloc(sizeof(struct node_link)); 

    node->num = a; 
    node->next = NULL; 
    head = node; 

    do 
    { 
     puts("Please enter any number of integers, end inputs with a ZERO (0): "); 
     scanf("%d", &a); 

     node = (struct node_link*)malloc(sizeof(struct node_link)); 
     node->num = a; 
     node->next = NULL; 
     head = add_node(head,node); 
    }while(a != 0); 

    display_newlist(head); 

    return 0; 
} 
+0

Es wird einfacher, wenn Sie die Logik trennen. Erstellen Sie zuerst eine verknüpfte Listenbibliothek, mit der Sie beliebige Elemente einfügen und die Liste durchlaufen können. * Dann * schreibe deine 'add_ *' -Funktion und lasse sie deinen zuvor geschriebenen verketteten Listencode verwenden, um auf deine verknüpfte Liste zuzugreifen –

+0

Die Funktion: 'compare_node' hat einen Ausführungspfad, der nicht in einem 'Rückgabewert' endet; Erklärung. Dieser Fehler in der Logik bewirkt, dass der Compiler die Warnung auslöst: 31: 1: Warnung; Die Steuerung erreicht das Ende der nicht-void-Funktion [-Werturn-type] – user3629249

+0

in der 'main()' -Funktion wird die Variable 'a' nicht initialisiert, so dass diese Zeile: 'node-> num = a;' einen unbekannten' trash setzt 'Wert in den ersten Knoten. – user3629249

Antwort

0

Sie können durch diese Art und Weise tun, dass

1- Ersetzen dass int num mit einem beliebigen Anordnung von Zeichen

2- in Vergleichsfunktion versuchen, Elemente der char Array vergleichen unter Verwendung von strcmp Funktion dann Rückkehr Werte entsprechend der von compare() Funktion.

3- Ersetzen Evry num durch Anordnung von Zeichenvariable

Verwandte Themen