键盘输入单词个数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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: