подсчет количества вхождений строки в связанном списке - PullRequest
0 голосов
/ 19 декабря 2018

Привет, я новичок в программировании на C.Я написал код, который берет содержимое из входного файла для создания связанного списка.Так что все имена связаны между собой.Том связан с Джеком и так далее.входной файл:

tom
jack
tom
mark
tom
jake

Я написал функцию, которая подсчитывает количество вхождений, однако, независимо от того, что я пытаюсь, я продолжаю получать предупреждения, и счет tom всегда 0.

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

#define MAXN 50     

typedef struct node {
    char name[MAXN];
    struct node *next;
}
node;

int count( node* head, char search_for) 
{ 
    node* current = head; 
    int count = 0; 
    while (current != NULL) 
    { 
        if (current->name== search_for) 
           count++; 
        current = current->next; 
    } 
    return count; 
} 



int main (int argc, char **argv) {

    FILE *file = argc > 1 ? fopen (argv[1], "r") : stdin;
    if (file == NULL)
        return 1;

    char buf[MAXN];

    node *first = NULL, *last = NULL;  


    while (fgets (buf, MAXN, file)) {


        node *head = malloc (sizeof(node));
        if (head == NULL) {         
            perror ("malloc-node"); 
            return 1;   
        }


        buf[strcspn(buf, "\n")] = 0;    


        strcpy (head->name, buf);
        head->next = NULL;


        if (!last)
            first = last = head;
        else {
            last->next = head;
            last = head;
        }
    }

    if (file != stdin) 
        fclose(file);
        node *ptr = first;
        printf("count of tom is %d", count(ptr->name, 't'));


        return 0;
    }

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

В вашем коде есть несколько ошибок.

  1. Ваша функция count принимает узел и символ.Он должен содержать узел и массив символов (char *).
  2. Когда вы вызываете count, вы вызываете его с массивом char и char.Вы должны вызывать его с указателем узла и массивом символов.Не забывайте обозначать строки символом «» (т. Е. «Том», а не «том»).
  3. Вы не можете сравнивать массивы с символом ==.Для этого используйте strcmp .

Вот рабочая версия вашего кода.

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

#define MAXN 50     

typedef struct node {
    char name[MAXN];
    struct node *next;
}
node;

int count( node* head, char * search_for)  //Char * search_for instead of char search_for
{ 
    node* current = head; 
    int count = 0; 
    while (current != NULL) 
    { 
        if (strcmp(current->name,search_for) == 0) { //using strcmp instead of ==
           count++; 
        }
        current = current->next; 
    } 
    return count; 
} 



int main (int argc, char **argv) {

    FILE *file = argc > 1 ? fopen (argv[1], "r") : stdin;
    if (file == NULL)
        return 1;

    char buf[MAXN];

    node *first = NULL, *last = NULL;  


    while (fgets (buf, MAXN, file)) {


        node *head = malloc (sizeof(node));
        if (head == NULL) {         
            perror ("malloc-node"); 
            return 1;   
        }


        buf[strcspn(buf, "\n")] = 0;    


        strcpy (head->name, buf);
        head->next = NULL;


        if (!last)
            first = last = head;
        else {
            last->next = head;
            last = head;
        }
    }

    if (file != stdin) fclose(file);
    node *ptr = first;
    printf("count of tom is %d", count(ptr, "tom")); // ptr instead of ptr->name and "tom" instead of 'tom'
    return 0;
}
0 голосов
/ 19 декабря 2018

Вы не можете сравнивать два массива символов с ==.Вместо этого вы должны использовать функцию strcmp ().Первый (или второй, порядок не имеет значения) должен быть именем текущего узла в связанном списке, а другой будет параметром, который вы передаете в функцию (search_for).strcmp () вернет 0, если они одинаковы, и в этом случае вы будете увеличивать переменную count.

...