Я пишу программу (на языке C), которая принимает имена из командной строки, помещает их в связанный список и возвращает число, которое соответствует положению указанного имени в списке. Если имени нет в списке, программа возвращает -1. Например, если я запустил свою программу как

./a Chris Sale Jay Cutler Kermit Bob

Результат должен быть

Chris is at position 1

Sale is at position 2

Jay is at position 3

И так далее.

И тогда вывод для Big Al (в моем коде) будет

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
Ethan H 18 Апр 2016 в 01:35

3 ответа

Лучший ответ

Вам не нужен этот цикл 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
Fiery Phoenix 17 Апр 2016 в 23:37

Ваша программа работает нормально. Вам не нужен цикл for в функции position . Вы уже просматриваете список. Все, что вам нужно сделать, это увеличить значение переменной 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
SandBag_1996 18 Апр 2016 в 00:29

Вам не нужен цикл 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;
}
0
sk1984 20 Апр 2016 в 14:50