关于#链表#的问题:键盘输入单词个数n及n个单词(语言-c语言)

键盘输入单词个数n及n个单词,输入程序,建立单项链表,实现:
1,如果单词重复,在练表上只保留一个。
2,除满足1外,链表节点还应有个计数域记录该单词重复出现次数,然后输出出现次数最多的前k(k<n,需键盘输入)个单词。



#include <stdio.h>

#define LEN 20

typedef struct _Node
{
    char word[LEN];
    int count;
    struct _Node *next;
} Node, *LNode;

//查找重复,同时找到重复次数最多的单词
int find(LNode L, char *s, int *max)
{
    LNode p = L;
    while (p)
    {
        if (strcmp(p->word, s) == 0)
        {
            p->count++;
            if (*max < p->count)
                *max = p->count;
            return 1;
        }
        p = p->next;
    }
    return 0;
}

void printK(LNode head, int k, int max)
{
    if (k == 0)
        return;
    LNode p = head;
    while (p && k)
    {
        if (p->count == max)
        {
            printf("%s   %d\n", p->word, p->count);
            k--;
        }
        p = p->next;
    }
    printK(head, k, --max);
}

int main()
{
    int n, max = 0, length = 0; // max最多次数,length链表长度
    char buf[LEN];
    LNode head = NULL, p, q;
    scanf("%d", &n);
    while (n--)
    {
        fflush(stdin);
        scanf("%s", buf);
        if (find(head, buf, &max) == 0) //没有重复才建立新节点
        {
            p = (LNode)calloc(1, sizeof(Node));
            strcpy(p->word, buf);
            p->count++;
            if (head == NULL)
            {
                head = p;
                q = head;
            }
            else
            {
                q->next = p;
                q = p;
            }
            length++;
        }
    }
    printf("\n");
    p = head;
    while (p) //输出链表
    {
        printf("%s   %d\n", p->word, p->count);
        p = p->next;
    }

    printf("\n");

    int k;
    scanf("%d", &k);
    if (k > length) //防止超出链表
        k = length;
    printK(head, k, max);

    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^