69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define Out 0
#define In 1
struct Words
{
char Word[20];
int Times;
struct Words *pnew;
};
typedef struct Words NODE;
NODE *Word_Link(char str[]);
void OutPut(NODE *head);
void Free_Link(NODE *head);
char *get_word(char *str, char **words_left)
{
char *word = NULL;
char *tmp = NULL;
tmp = str;
while (tmp == ' ') tmp++; /* trim header blanks */
word = tmp;
if (tmp)
{
tmp = strchr(tmp, ' ');
}
if (tmp)
{
memset(tmp, 0, 1);
tmp++;
while (tmp == ' ') tmp++; /* trim tail blanks */
if (tmp == '\0')
{
tmp = NULL;
}
}
if (words_left)
*words_left = tmp;
return word;
}
int main()
{
NODE *head;
char str[100];
printf("Please input a string: ");
gets(str);
head = Word_Link(str);
if (head == NULL)
{
printf("No enough memory!\n");
exit(-1);
}
OutPut(head);
Free_Link(head);
return 0;
}
NODE *Word_Link(char str[])
{
NODE *head = NULL, *p = NULL;
char *word = NULL, *tmp = NULL, *left = NULL;
head = (NODE *)malloc(sizeof(NODE));
memset(head, 0, sizeof(NODE));
if (head == NULL)
{
printf("No enough memory!");
return (NULL);
}
left = str;
while (word = get_word(left, &left))
{
if (head->Word[0] == '\0')
{
head->Times = 1;
strcpy(head->Word, word);
}
else
{
p = head;
while (p)
{
if (strcmp(p->Word, word) == 0)
{
p->Times++;
break;
}
p = p->pnew;
}
if (p == NULL)
{
p = (NODE *)malloc(sizeof(NODE));
memset(p, 0, sizeof(NODE));
strcpy(p->Word, word);
p->Times++;
p->pnew = head;
head = p;
}
}
}
return (head);
}
void OutPut(NODE *head) //输出链表
{
NODE *p = NULL;
for (p = head; p != NULL; p = p->pnew)
printf("%s\t%d\n", p->Word, p->Times);
}
void Free_Link(NODE *head) //销毁链表
{
NODE *p = NULL, *tmp = NULL;
p = head;
while (p)
{
tmp = p;
p = p->pnew;
free(tmp);
}
}
// 11.编写依程序,他读入一行正文,统计在正文中出现的各个字的次数,
// 并按字典顺序显示结果。例如:how do you do,输出结果为:
// do 2
// how 1
// you 1
// 提示:用链表方式存储每个单词和出现次数,从文中每次分离一个字,
// 就遍历链表是否存在该数字,存在则计数加一,否则按序加到链表中
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define Out 0
#define In 1
struct Words
{
char Word[20];
int Times;
struct Words *pnew;
};
typedef struct Words NODE;
NODE *Word_Link(char str[]);
void OutPut(NODE *head);
void Free_Link(NODE *head);
int main()
{
NODE *head;
char str[100];
printf("Please input a string: ");
fgets(str, 100, stdin);
head = Word_Link(str);
if(head == NULL)
{
printf("No enough memory!\n");
exit (-1);
}
OutPut(head);
Free_Link(head);
return 0;
}
NODE *Word_Link(char str[])
{
NODE *head, *tail, *p;
char word[20];
int i, j = 0;
int tag = Out;
head = (NODE *)malloc(sizeof(NODE));
if(head == NULL)
{
printf("No enough memory!");
return (NULL);
}
head->pnew = NULL;
tail = head;
for(i = 0; str[i] != '\0'; i++)
{
if(tolower(str[i]) >= 'a' && tolower(str[i]) <= 'z') //将字符转化为小写
{
if(tag == Out) //判断是否是进入了单词
{
memset(word, 0, 20*sizeof(char)); //先将word清零
word[0] = str[i];
tag = In; //标识进入了单词中
}
else
word[++j] = str[i]; //依次赋值
}
else
{
if(tag == In) //判断之前是否进入了单词
{
tag = Out; //标识出了单词
word[++j] = '\0'; //字符串结束标志
}
}
if(tag == Out && j != 0) //判断是否是一个完整的单词
{
if(head->pnew == NULL) //判断是否第一次插入链表
{
p = (NODE *)malloc(sizeof(NODE));
if(p == NULL)
{
printf("No enough memory!");
return (NULL);
}
p->Times = 1; //计数为1
strcpy(p->Word, word); //复制单词
head->pnew = p;
p->pnew =NULL;
tail = p;
}
else
{
p = (NODE *)malloc(sizeof(NODE));
if(p == NULL)
{
printf("No enough memory!");
return (NULL);
}
for(p = head->pnew; p != NULL; p = p->pnew) //判断是否单词已存在
if(strcmp(p->Word, word) == 0) //若已存在
{
p->Times = p->Times + 1;
break;
}
if(p == NULL) //若不存在
{
p = (NODE *)malloc(sizeof(NODE));
if(p == NULL)
{
printf("No enough memory!");
return (NULL);
}
strcpy(p->Word, word);
p->Times = 1;
tail->pnew = p;
tail = p;
}
}
j = 0;
}
}
return (head);
}
void OutPut(NODE *head) //输出链表
{
NODE *p;
for(p = head->pnew; p != NULL; p = p->pnew)
printf("%s %d\n",p->Word, p->Times);
}
void Free_Link(NODE *head) //销毁链表
{
NODE *p, *q;
for(p = head; p != NULL; p = p->pnew)
{
q = p->pnew;
p->pnew = q->pnew;
free(q);
}
free(head);
}