1. 程式人生 > >資料結構|一道還蠻有意思的連結串列題

資料結構|一道還蠻有意思的連結串列題

最近在二刷資料結構,也偶爾去刷一下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個單詞
*/