首页 > 解决方案 > 计算元素频率的C程序

问题描述

我有这个代码可以从用户输入的数字中找到数字的出现。我的问题是如何首先按用户输入数字,然后要求用户在序列中找到他的号码。如果这个问题很愚蠢,我很抱歉,但我只是一个试图自学编程的初学者:) 非常感谢你的帮助!

这是我当前的代码:

int main()
{
    int num, remainder, k, count = 0;

    printf("Which number do you want to find:  \n");
    scanf("%d", &k);

    while(1)
    {
        printf("Enter numbers(end by pressing 0): ");
        scanf("%d", &num);

        remainder=num;
        if(remainder==k)count++;
        if(remainder==0) break;

    }


    printf("\Number %d occurs %d times.\n", k, count);


    getch();
    return 0;
}

这是我尝试过的:

int main()
{
    int num, remainder, k, count = 0;


    while(1)
    {
        printf("Enter numbers(end by pressing 0): ");
        scanf("%d", &num);

        remainder=num;
        if(remainder==k)count++;
        if(remainder==0) break;

    }

    printf("Which number do you want to find:  \n");
    scanf("%d", &k);

    printf("\Number %d occurs %d times.\n", k, count);


    getch();
    return 0;

标签: cfind-occurrences

解决方案


对于您的任务,您需要称为单链表的数据结构。理论上它没有限制,您可以输入任何数字序列,直到输入 0。

这是一个演示程序:

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

struct node
{
    int number;
    struct node *next;
};

struct sequence
{
    struct node *head;
    struct node *tail;
};

int append( struct sequence *seq, int number )
{
    struct node *new_node = malloc( sizeof( *new_node ) );
    int success = new_node != NULL;

    if( success )
    {
        new_node->number =number;
        new_node->next = NULL;
        
        if ( seq->head == NULL )
        {
            seq->head = new_node;
        }
        else
        {
            seq->tail->next = new_node;
        }

        seq->tail = new_node;
    }

    return success;
}

size_t count( const struct sequence *seq, int number )
{
    size_t cnt = 0;

    for ( const struct node *current = seq->head; current != NULL; current = current->next )
    {
        if ( current->number == number ) ++cnt;
    }

    return cnt;
}

void clear( struct sequence *seq )
{
    while ( seq->head != NULL )
    {
        struct node *current = seq->head;
        seq->head = seq->head->next;
        free( current );
    }

    seq->tail = NULL;
}
        
int main(void) 
{
    struct sequence seq = { .head = NULL, .tail = NULL };

    printf( "Enter numbers (end by entering 0): " );

    int number;

    while ( scanf( "%d", &number ) == 1 && number != 0 && append( &seq, number ) );

    number = 0;

    printf( "Which number do you want to find: " );

    scanf( "%d", &number );

    printf( "\nNumber %d occurs %zu times.\n", number, count( &seq, number ) );

    clear( &seq );

    return 0;
}

它的输出可能看起来像

Enter numbers (end by entering 0): 1 2 3 4 5 6 7 8 9 1 8 7 6 5 4 3 2 1 0
Which number do you want to find: 1
Number 1 occurs 3 times.

推荐阅读