数据结构|一道还蛮有意思的链表题

最近在二刷数据结构,也偶尔去刷一下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个单词
*/

猜你喜欢

转载自blog.csdn.net/qq_39985013/article/details/82824821
今日推荐