哪位大哥帮帮忙找找错误,美女也行

tananade 2009-06-26 11:29:26
// 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: ");
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, *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->pnew != NULL; p = p->pnew) //判断是否单词已存在
if(strcmp(p->Word, word) == 0) //若已存在
{
p->Times = p->Times + 1;
break;
}
if(p->pnew == 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->pnew != NULL; p = p->pnew)
{
q = p->pnew;
p->pnew = q->pnew;
free(q);
}
free(head);
}

每次运行到第三个单词就出错,比如输入 how do you do他在you那里就卡死,老是循环不动,
不往下面运行。 我却找不出错误,哪位帅哥帮帮忙啊
...全文
94 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tananade 2009-06-27
  • 打赏
  • 举报
回复
你这有问题,而且我要知道我错哪?这是最重要的
nadoo 2009-06-27
  • 打赏
  • 举报
回复

#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);
}
}

tananade 2009-06-27
  • 打赏
  • 举报
回复
// 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: ");
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, *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); //复制单词
printf("%s\n",p->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->pnew != NULL; p = p->pnew) //判断是否单词已存在
if(strcmp(p->Word, word) == 0) //若已存在
{
p->Times = p->Times + 1;
break;
}
if(p->pnew == NULL) //若不存在
{
p->pnew = NULL;
strcpy(p->Word, word);
printf("%s\n",p->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->pnew != NULL; p = p->pnew)
{
q = p->pnew;
p->pnew = q->pnew;
free(q);
}
free(head);
}

每次运行到第三个单词就出错,比如输入 how do you do他在you那里就卡死,老是循环不动,
不往下面运行。 我却找不出错误,哪位帅哥帮帮忙啊
cheng_fengming 2009-06-27
  • 打赏
  • 举报
回复
int tag = Out;是什么意思,我没看见out的值啊,这样初始化不会出错?
萧霖 2009-06-27
  • 打赏
  • 举报
回复
纯C的东东,学习
nadoo 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tananade 的回复:]
你这有问题,而且我要知道我错哪?这是最重要的
[/Quote]

有什么问题?vs2008编译运行结果:

Please input a string: how do you do how do do do you asdas adakskd
adakskd 1
asdas 1
you 2
do 5
how 2
Press any key to continue . . .
老邓 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zouyuncheng 的回复:]
排序自己解决,程序能运行了(codeblocks+GCC4.4)
[/Quote]
哦,那纯接分了
nadoo 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tananade 的回复:]
引用 7 楼 nadoo 的回复:
引用 3 楼 tananade 的回复:
你这有问题,而且我要知道我错哪?这是最重要的


有什么问题?vs2008编译运行结果:

Please input a string: how do you do how do do do you asdas adakskd
adakskd 1
asdas 1
you 2
do 5
how 2
Press any key to continue . . .



我用的是VC,这上面编译都过不去,所以分不能给你了,对不起
可能是VC的错

1.cpp
c:\do…
[/Quote]

你要是以C语言的方式应该能编过,C++编译器似乎必须显示强制类型转换
tananade 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nadoo 的回复:]
引用 3 楼 tananade 的回复:
你这有问题,而且我要知道我错哪?这是最重要的



有什么问题?vs2008编译运行结果:

Please input a string: how do you do how do do do you asdas adakskd
adakskd 1
asdas 1
you 2
do 5
how 2
Press any key to continue . . .
[/Quote]

我用的是VC,这上面编译都过不去,所以分不能给你了,对不起
可能是VC的错

1.cpp
c:\documents and settings\administrator\桌面\1.cpp(30) : error C2446: '==' : no conversion from 'int' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\administrator\桌面\1.cpp(30) : error C2040: '==' : 'char *' differs in levels of indirection from 'int'
c:\documents and settings\administrator\桌面\1.cpp(44) : error C2446: '==' : no conversion from 'int' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\administrator\桌面\1.cpp(44) : error C2040: '==' : 'char *' differs in levels of indirection from 'int'
执行 cl.exe 时出错.

1.obj - 1 error(s), 0 warning(s)
玩笑 2009-06-27
  • 打赏
  • 举报
回复
排序自己解决,程序能运行了(codeblocks+GCC4.4)
玩笑 2009-06-27
  • 打赏
  • 举报
回复
//  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);
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧