2016-04-17 6 views
-1

Ich schreibe ein Programm (in C), das Namen von der Befehlszeile übernimmt, sie in eine verknüpfte Liste einfügt und eine entsprechende Zahl zurückgibt mit der Position des Namens in der Liste. Wenn der Name nicht in der Liste enthalten ist, gibt das Programm eine -1 zurück. Zum Beispiel, wenn ich laufe mein Programm alsSchreiben einer Funktion, die eine Zeichenfolgenposition in einer Liste zurückgibt (C-Code)

./a Chris Sale Jay Cutler Kermit Bob 

Der Ausgang

Chris is at position 1 

Sale is at position 2 

Jay is at position 3 

und so weiter sein sollte.

Und dann ist der Ausgang für Big Al (in meinem Code) würde mit Ausnahme der Funktion

Big Al is at position -1 

Ich habe den gesamten Code sein, der die Position des Namens zurückgibt, die eingegeben wird.

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

typedef struct node { 
char *name; 
struct node *next; 
} Node; 

// function signatures 

int position(char *, Node *); 
Node *addEnd(char *, Node *); 

// code for position goes here (what I need help with) 
int position(char *c, Node *list) { 
    int num = -1; 
    Node *temp = list; 
    while(temp != NULL) { 
      for(num = 1; num < temp; num++) { 
       if(strcmp(temp->name, c) == 0) { 
        return num; 
       } 
      } 
     temp = temp->next; 
     } 
    return num; 
} 

/////////////////////////////////////////// ///////////////

Node *addEnd(char *n, Node *list) { 
    Node *newOne = malloc(sizeof(Node)); 
    newOne->name = malloc(strlen(n)+1); 
    strcpy(newOne->name, n); 
    newOne->next = NULL; 

    if (list == NULL) 
     return newOne; 
    Node *temp = list; 
    while (temp->next != NULL) 
     temp = temp->next; 
    temp->next = newOne; 
    return list; 
} 

//////////////////////////// //////////////////////////////

int main(int argc, char *argv[]) { 
    Node *list = NULL; 
    int a; 

    printf("Adding people to the list\n\n"); 
    for (a=1; a<argc; a++) 
     list = addEnd(argv[a], list); 

    printf("Finding positions of people in the list\n\n"); 
    for (a=1; a<argc; a++) 
     printf("%s is at position %d\n", argv[a], position(argv[a], list)); 

    printf("\nChecking for people that don't exist\n"); 
    printf("Big Al is at position %d\n", position("Big Al", list)); 

    return 0; 
} 

Derzeit erhalte ich einen Übersetzungsfehler:

where.c: In function ‘position’: 
where.c:20:20: warning: comparison between pointer and integer 
    for(num = 0; num < temp; num++) { 

Und ich weiß, ich kann diesen Vergleich nicht machen, aber ich habe keine Ahnung, was ich von hier aus tun soll. Hilfe würde sehr geschätzt werden.

+1

Ich verstehe nicht, dass die Linie finden 'für (num = 0; num usr2564301

+0

Sie durchlaufen bereits die Liste mit while (temp! = NULL) und temp = temp-> next, warum brauchen Sie das ** für ** loop? –

Antwort

1

Sie brauchen nicht, dass for Schleife. Sie durchlaufen die verkettete Liste mit einer while Schleife, bis sie nicht auf einen nächsten Knoten zeigt.

int position(char *c, Node *list) { 
    int num = 1; 
    Node *temp = list; 
    while(temp != NULL) { 
     if(strcmp(temp->name, c) == 0) { 
      return num; 
     } 
     num++; 
     temp = temp->next; 
    } 
    return -1; 
} 
+1

Perfekt, ich habe vergessen, dass meine While-Schleife die Liste ohne eine weitere Schleife durchlaufen wird. Vielen Dank! –

1

Ihr Programm läuft gut. Sie benötigen die für Schleife in Position Funktion nicht. Sie durchlaufen bereits die Liste. Alles, was Sie tun müssen, ist die Variable num in Ihrer Positionsfunktion zu erhöhen.

Fügen Sie einfach num ++ in Ihrer Positionsfunktion hinzu. Betrachten Sie das folgende Codestück:

int position(char *c, Node *list) { 
    int num = 1; 
    Node *temp = list; 
    while(temp != NULL) { 

       if(strcmp(temp->name, c) == 0) { 
        return num; 
       } 
       num++; 

       temp = temp->next; 
    } 
    return -1; 
} 
+1

Dieser Code wird -1 nicht zurückgeben, wenn die Zeichenfolge nicht in der Liste vorhanden ist, noch gibt er die richtige Position zurück, da er mit -1 beginnt. – burzan

+0

Ja, richtig, es wird -1 nicht zurückgegeben, wenn die Zeichenfolge nicht vorhanden ist. Nun, noch nicht dein ursprüngliches Programm. Das habe ich verpasst. Ich werde es entsprechend modifizieren. Es gibt jedoch die richtige Position zurück. –

0

Sie brauchen die nicht für Schleife und einen Zeiger auf einen int Vergleich macht keinen Sinn, außer dass Sie bekam es fast richtig: D

int position(char *c, Node *list) 
{ 
    int num = 0; 
    Node *temp = list; 

    while (temp != NULL) 
    { 
     if (strcmp(temp->name, c) == 0) 
     { 
      return num; 
     } 

     num++; 
     temp = temp->next; 
    } 

    return -1; 
} 
Verwandte Themen