#include <stdio.h>
#include <ctype.h>  /* 因为在读入过程中需要判断字符类型 */
#include <string.h> /* 程序中需要做字符串复制和比较 */
#include <stdlib.h> /* 程序中要做动态存储分配 */

enum { MAXLEN = 20 };
typedef struct node NODE, *LINK; /* 这一段是类型定义 */
struct node {
    char word[MAXLEN];
    int count;
    LINK next;
};

int getword(int limit, char w[]); /* 有关函数的原型*/
LINK addword(LINK l, char w[]);
void printwords(LINK l);

LINK list = NULL;   /* 全局变量，作为表的头指针 */
char word[MAXLEN];  /* 读入用的临时字符数组 */

int main (void) {
    while (getword(MAXLEN, word) != 0)
        list = addword(list, word);

    printwords(list);

    return 0;
}

void printwords(LINK p) {
    for ( ; p != NULL; p = p->next) 
        printf("%d  %s\n", p->count, p->word);
}

int getword(int limit, char w[]) { 
    /* 需要定义 */
}

LINK mknode(char w[]) {
    LINK p = (LINK)malloc(sizeof(NODE));
    if (p != NULL) {
        strncpy(p->word, w, MAXLEN);
        p->count = 1;
        p->next = NULL;
    }
    return p;
}

LINK addword(LINK p, char w[]) {
    if (p != NULL) {
        if(strcmp(p->word, w) == 0)
            p->count++;
        else
            p->next = addword(p->next, w);
        return p;
    }
    else
        return mknode(w);
}

/*
LINK addword(LINK list, char w[]) {
    LINK p;
    if (list == NULL) return mknode(w); 

    for (p = list; ; p = p->next) {
        if (strcmp(p->word, w) == 0) {
            p->count++;
            break;
        }
        if (p->next == NULL) {
            p->next = mknode(w);
            break;
        }
    }
    return list;
}
*/

/* 另一实现。调用方式改变了 
int addword(LINK *lp, char w[]) {
    LINK p;
    if (*lp == NULL) 
        return (*lp = mknode(w)) != NULL ? 1 : 0; 
    for (p = *lp; ; p = p->next) {
        if (strcmp(p->word, w) == 0) {
            p->count++;
            return 1;
        }
        if (p->next == NULL) {
            p->next = mknode(w);
            return p->next != NULL ? 1 : 0;
        }
    }
}
*/ 

