2016-04-17 14 views
-1

コマンドラインから名前をとり、それらをリンクリストに入れて対応する番号を返すプログラムを書いていますその名前の位置がリストに表示されます。名前がリストにない場合、プログラムは-1を返します。私はリスト内の文字列の位置を返す関数を書く(Cコード)

./a Chris Sale Jay Cutler Kermit Bob 

として私のプログラムを実行している場合たとえば、出力はそうで

Chris is at position 1 

Sale is at position 2 

Jay is at position 3 

こととすべきです。

そして(私のコードで)ビッグ・アルの出力はIが入力された名前の位置を返す関数以外のすべてのコードを持っている

Big Al is at position -1 

だろう。

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

は現在、私はコンパイルエラーを取得する:

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

そして私はこの比較をすることはできませんが、私はここから何をすべきか分かりません。ヘルプは非常に高く評価されます。

+1

は、私はそのラインを見つけることができませんあなたが表示するコードの 'for(num = 0; num usr2564301

+0

あなたは既に、(temp!= NULL)、temp = temp-> whileのリストを繰り返していますが、なぜ** loopのために**必要ですか? –

答えて

1

ループはforの必要はありません。次のノードを指し示さないまで、whileループを使用してリンクリストを反復処理します。

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

パーフェクト、私はwhileループが別のループを必要とせずにリストを歩くのを忘れていました。ありがとう! –

1

あなたのプログラムは正常に動作します。ループのは、の位置のループには必要ありません。すでにリストを繰り返しています。あなたのポジション関数のnum変数をインクリメントするだけです。

あなたの位置関数にnum ++を追加するだけです。次のコードスニペットを見てください。

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

このコードは、文字列がリストに存在しない場合は-1を返しません。また、-1から始まるため、正しい位置を返しません。 – burzan

+0

はい、文字列が存在しない場合、-1を返しません。まあ、オリジナルのプログラムもありません。私はそれを逃した。それに応じて修正します。しかし、それは正しい位置に戻ります。 –

0

あなたはほとんどそれが正しい得たこと以外、forループを必要とせず、int型へのポインタを比較することは意味がありません: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; 
} 
関連する問題