資料結構|一道還蠻有意思的連結串列題
阿新 • • 發佈:2018-11-10
最近在二刷資料結構,也偶爾去刷一下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個單詞 */