最近在二刷数据结构,也偶尔去刷一下Leetcode上的算法题,不过感觉自己还是太菜了,一道题经常憋半个小时一个小时,有时候也有用例死活过不去的情况(手动狗头),还是要多学习多看书多刷题,有机会也会把自己的一些刷题心得放在上面。
前几天把以前做过的一些数据结构题又拿出来看了一下,有这么一道题:
/*键盘输入英语单词的个数n及n个单词,编一程序,建立一个单向链表,实现:
(1)如果单词重复出现,则只在链表上保留一个。
(2)除满足(1)的要求外。链表结点还应有一个计数域,记录该单词重复出现的次数,然后输出出现次数最多的前k(k<=n,需键盘输入)个单词。
注:次数并列的情况考虑、不考虑均可。*/
思路还是比较清晰的,就是每出现一个新的单词,就在链表中生成一个新的结点,否则令其设置的计数域+1,对于(2)根据计数域对单词排序,输出前k个
这里贴出代码:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
typedef struct LinkNode
{
char word[20];
struct LinkNode *next;
int count;
}LinkNode;
/*
*定义链表中的结点,包括单词,指针,与出现的次数count
*/
LinkNode *wordCheck(LinkNode *head, char word[])
{
LinkNode *p;
if(head==NULL)
return NULL;
p=head->next;
while(p!=NULL)
{
if(strcmp(p->word, word)==0)
return p;
else
p=p->next;
}
return NULL;
}
/*
* 定义函数wordCheck,在当前链表查找有无重复单词,如果有重复则返回该单词的指针
* 如果没有重复返回NULL
*/
LinkNode *createLinkList()
{
int n;
char word[20];
LinkNode *head;
LinkNode *p1;
LinkNode *p2;
LinkNode *word_isnull;
head=(LinkNode*)malloc(sizeof(LinkNode));
if(head==NULL)
{
printf("分配失败");
return NULL;
}
head->next=NULL;
p1=head;
printf("请输入单词的个数");
scanf("%d",&n);
printf("请输入单词\n");
while(n--)
{
scanf("%s", word);
word_isnull=wordCheck(head, word);
/*word_isnull用于查找是否有重复单词,如果不重复,wordCheck方法返回null,并生成新的结点,否则返回当前单词,
令其计数域count加一
*/
if(word==NULL)
{
p2=(LinkNode*)malloc(sizeof(LinkNode));
if(p2==NULL)
{
printf("分配失败");
return head;
}
strcpy(p2->word, word);
p2->count=1;
p2->next=NULL;
p1->next=p2;
p1=p2;
}
else
word_isnull->count++;
}
return head;
}
/*
* 定义函数createLinkList创建链表,返回生成链表的头指针
*/
void sort(LinkNode *head)
{
LinkNode *p1;
LinkNode *p2;
LinkNode *maxCount;
if(head==NULL)
return;
for(p1=head->next; p1->next!=NULL; p1=p1->next)
{
maxCount=p1;
for(p2=p1->next; p2!=NULL; p2=p2->next)
{
if(p2->count>maxCount->count)
maxCount=p2;
}
}
}
/*
*定义函数sort对链表按照单词出现次数进行排序
*/
void input(LinkNode *head, int k)
{
LinkNode *p;
if(head==NULL)
return;
p=head->next;
printf("出现次数最多的%d个单词为:\n", k);
while(k!=0&&p!=NULL)
{
printf("%s出现了(%d次)\n", p->word, p->count);
p=p->next;
k--;
}
}
/*
* 定义input函数输出排序后的前k个单词
*/
int main()
{
int k;
LinkNode *head;
head =createLinkList();
sort(head);
printf("请输入要输出的单词数:");
scanf("%d", &k);
input(head, k);
return 0;
}
/*
*程序主函数,先创建符合要求的链表,然后调用sort对单词出现次数进行排序,最后输出前k个单词
*/