单向链表,输入n个英文单词,统计出现次数,链表不保留重复。请高手帮忙!!!

lin49154542 2011-05-24 10:49:42
键盘输入n个英语单词,需建立一个单向链表,实现:
如果单词重复出现,则只在链表上保留一个。链表结点还应有一个计数域,记录该单词重复出现的次数,然后输出出现次数最多的前k(k<=n)个单词。

调试了很久都没有弄出来,一直出现存储冲突。。。。请高手帮帮忙。谢谢


#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>
#define maxsize 20

typedef struct node
{
int freg;//频度域,记单词出现的次数。
char word[maxsize];//maxsize是单词中可能含有的最多字母个数
struct node *next;

}node, *LinkedList;
LinkedList creat(int n) //建立有n(n>0)个单词的单向链表,若单词重复出现,则只在链表中保留一个。
{
//struct node *la;
LinkedList la;
la=(LinkedList)malloc(sizeof(node));//申请头结点。
la->next=NULL; //链表初始化。
node *p,*pre;
p=(node*)malloc(sizeof(node));
pre=(node*)malloc(sizeof(node));
char a[maxsize];
for(int i=1;i<=n;i++) //建立n个结点的链表
{
scanf("%s",a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;
pre=p; //p是工作指针,pre是前驱指针。
while(p!=NULL)
{
if(strcmp(p->word,a)==0) {p->freg++;break;} //如果输入单词重复出现,频度增1。
else {pre=p;p=p->next;}
}//指针后移。
if(p==NULL) //该单词没出现过,应插入。
{
p=(LinkedList)malloc(sizeof(node));
strcpy(p->word,a);//将键入的单词输入链表
p->freg=1;//统计该单词出现次数只有1
p->next=NULL;
pre=p;
} //将新结点插入到链表最后。
}//结束for循环。
return(la);
}//结束creat算法。


void CreatOut( int n)
//建立有n个单词的单向链表,重复单词只在链表中保留一个,最后输出频度最高的k个单词。
{

LinkedList la;
la=(LinkedList)malloc(sizeof(node));//申请头结点。
la->next=NULL; //链表初始化。
node *p,*pre,*q;
//p=la->next;pre=p; //p是工作指针,pre是前驱指针。
char a[maxsize];
for(int i=1;i<=n;i++) //建立n个结点的链表
{
scanf("%s",a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;
pre=p; //p是工作指针,pre是前驱指针。
while(p!=NULL)
{
if(strcmp(p->word,a)==0)
{
p->freg++; //单词重复出现,频度增1。
pre->next=p->next; //先将p结点从链表上摘下,再按频度域值插入到合适位置
pre=la;
q=la->next;
while(q->freg>p->freg) //这里的循环··好像有点问题
{
pre=q;
q=q->next;
}
pre->next=p;
p->next=q;
}
else
{
pre=p;
p=p->next;
} //指针后移。
}
if(p==NULL) //该单词没出现过,应插入到链表最后。
{
p=(LinkedList)malloc(sizeof(node));
strcpy(p->word,a);
p->freg=1;
//la->next=p;

p->next=NULL;
pre->next=p; //调试到这里出错

}//if 新结点插入。

}//结束for循环建表。
int k,i=0;

scanf("%d",&k);
p=la->next;
while (p && i<k) //输出频度最高的k个单词
{printf("第%3d个单词%s出现%3d次\n",++i,p->word,p->freg);
p=p->next;
}
if (!p)
printf("给出的%d值太大\n",k);

}

void main()
{
printf("输入单词个数:");
int a;
scanf("%d",&a);
printf("输入单词个数:%d\n",a);
CreatOut(a);
}
...全文
679 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lin49154542 的回复:]

引用 6 楼 linshuqiang 的回复:

for(int i=1;i<=n;i++) //建立n个结点的链表
{
scanf("%s",a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;
pre=p; //p是工作指针,pre是前驱指针。
while(p!=NULL)
{
if(strcmp(p->word,a)==0) {p->freg++……
[/Quote]
jf~
lin49154542 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linshuqiang 的回复:]

for(int i=1;i<=n;i++) //建立n个结点的链表
{
scanf("%s",a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;
pre=p; //p是工作指针,pre是前驱指针。
while(p!=NULL)
{
if(strcmp(p->word,a)==0) {p->freg++;break;} //如果输入单词重复出现,频度增1。……
[/Quote]

谢谢你,问题解决了。
linshuqiang 2011-05-25
  • 打赏
  • 举报
回复
for(int i=1;i<=n;i++) //建立n个结点的链表
{
scanf("%s",a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;
pre=p; //p是工作指针,pre是前驱指针。
while(p!=NULL)
{
if(strcmp(p->word,a)==0) {p->freg++;break;} //如果输入单词重复出现,频度增1。
else {pre=p;p=p->next;}
}//指针后移。
if(p==NULL) //该单词没出现过,应插入。
{
p=(LinkedList)malloc(sizeof(node));
strcpy(p->word,a);//将键入的单词输入链表
p->freg=1;//统计该单词出现次数只有1
p->next=NULL;//
pre->next=p;} //新的节点是插到pre的next中去,而不是覆盖掉pre的,将新结点插入到链表最后。
}//结束for循环。
lin49154542 2011-05-24
  • 打赏
  • 举报
回复
其实creatout算法··已经包括creat 主是我的creatout 出问题。。。
lin49154542 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lirg8405 的回复:]

creat算法
实现有问题
pre=p; //p是工作指针,pre是前驱指针。
应该使用pre = la;
[/Quote]

改了之后 后面的while 会出现死循环。。。
··郁闷··
lirg8405 2011-05-24
  • 打赏
  • 举报
回复
下面的函数一样,逻辑上没有看。。。
lirg8405 2011-05-24
  • 打赏
  • 举报
回复
creat算法
实现有问题
pre=p; //p是工作指针,pre是前驱指针。
应该使用pre = la;
lin49154542 2011-05-24
  • 打赏
  • 举报
回复
例如我要输5个单词
就先输数字5
然后 一个一个单词键入电脑。
独辟蹊径,角度很好,尤其适合我们要找一个好工作的想法,你为公司做了很多事情,也学了很多技术,可是 面试的题目你不一定能够过关,因为面试考题角度特别。要提高自己的生存能力,还是多研究一下吧。我看了前面的四章,还是有收获的,包括技术上。 程序员面试攻略》 偶得此书,观之,叹为奇书。从求职到面试,从数据结构到算法,从智力题到非技术题,无不一一涵盖。急上网搜之,得矣。列诸信息及下载地址,供大家参考。同时也祝贺找工作完全进入应试时代…… 《程序员面试攻略》(Programming Interview Exposed: Secrets to Landing Your Next Job),Mongan,J.等著,杨晓云等译,北京,机械工业出版社,2003.3 目录: 第1章求职过程1 1.1 与公司进行接触1 1.2 筛选面试3 1.3 正式面试3 1.4 衣着4 1.5 职业中介4 1.6 工作邀约和磋商5 1.7 接受或拒绝工作邀约7 第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 插入与删除22 3.2 双向链表24 3.3 循环链表24 3.4 面试例题:堆栈的实现25 3.5 面试例题:链表的尾指针31 3.6 面试例题:对RemoveHead函数进行纠错37 3.7 面试例题:链表中的倒数第m个元素39 3.8 面试例题:链表的扁平化42 3.9 面试例题:空链表与循环链表48 第4章树和图53 4.1 树53 4.1.1 二元树54 4.1.2 二元搜索树55 4.1.3 堆57 4.1.4 常用的搜索方法58 4.1.5 遍历58 4.2 图59 4.3 面试例题:左遍历59 4.4 面试例题:左遍历,不使用递归60 4.5 面试例题:最低公共祖先63 第5章数组与字符串65 5.1 数组65 5.1.1 C / C++ 66 5.1.2 Java 67 5.1.3 Perl67 5.2 字符串68 5.2.1 C 68 5.2.2 C++ 68 5.2.3 Java 69 5.2.4 Perl 69 5.3 面试例题:第一个无重复字符69 5.4 面试例题:删除特定字符72 5.5 面试例题:颠倒单词的出现顺序76 5.6 面试例题:整数/字符串之间的转换81 第6章递归算法87 6.1 面试例题:二分法搜索91 6.2 面试例题:字符串的全排列93 6.3 面试例题:字符串的全组合98 6.4 面试例题:电话键单词101 第7章其他程序设计问题109 7.1 计算机图形109 7.2 位操作符110 7.3 结构化查询语言112 7.4 并发程序设计技术115 7.5 面试例题:绘制八分之一圆形117 7.6 面试例题:矩形是否重叠120 7.7 面试例题:字节的升序存储和降序存储方式124 7.8 面试例题:“1”的个数126 7.9 面试例题:简单的SQL查询129 7.10 面试例题:公司和员工数据库129 7.11 面试例题:最大值,不允许使用统计功能131 7.12 面试例题:生产者/消费者问题132 第8章与计数、测量、排序有关的智力题139 8.1 面试例题:开锁143 8.2 面试例题:三个开关145 8.3 面试例题:过桥146 8.4 面试例题:找石头149 第9章与图形和空间有关的智力题153 9.1 面试例题:船和码头154 9.2 面试例题:数方块156 9.3 面试例题:狐狸与鸭子159 9.4 面试例题:导火索161 9.5 面试例题:躲火车163 第10章计算机基础知识165 10.1 个人简历165 10.2 答题要点165 10.3 面试例题:C++和Java 166 10.4 面试例题:头文件167 10.5 面试例题:存储类别167 10.6 面试例题:friend类168 10.7 面试例题:类与结构168 10.8 面试例题:父类与子类169 10.9 面试例题:参数传递170 10.10 面试例题:宏与内嵌函数171 10.11 面试例题:继承173 10.12 面试例题:面向对象的程序设计173 10.13 面试例题:与线程有关的程序设计问题174 10.14 面试例题:废弃内存的自动回收175 10.15 面试例题:32位操作系统177 10.16 面试例题:网络性能177 10.17 面试例题:高速磁盘缓存177 10.18 面试例题:数据库的优点178 10.19 面试例题:加密技术178 10.20 面试例题:新的加密算法179 10.21 面试例题:哈希表与二元搜索树1 7 9 第11章非技术问题181 11.1 答题要点181 11.2 问题:你打算从事哪方面的工作? 182 11.3 问题:你最喜欢的程序设计语言是哪一种? 183 11.4 问题:你的工作习惯是怎样的?184 11.5 问题:可以说说你的个人经历吗?184 11.6 问题:你的职业目标是什么? 184 11.7 问题:你为什么要换工作? 184 11.8 问题:你希望拿多少报酬? 185 11.9 问题:你以前的报酬水平是多少? 187 11.10 问题:我们为什么要雇佣你? 188 11.11 问题:你有什么问题想问我吗?188 附录写个人简历的方法189 VII
独辟蹊径,角度很好,尤其适合我们要找一个好工作的想法,你为公司做了很多事情,也学了很多技术,可是 面试的题目你不一定能够过关,因为面试考题角度特别。要提高自己的生存能力,还是多研究一下吧。我看了前面的四章,还是有收获的,包括技术上。 程序员面试攻略》 偶得此书,观之,叹为奇书。从求职到面试,从数据结构到算法,从智力题到非技术题,无不一一涵盖。急上网搜之,得矣。列诸信息及下载地址,供大家参考。同时也祝贺找工作完全进入应试时代…… 《程序员面试攻略》(Programming Interview Exposed: Secrets to Landing Your Next Job),Mongan,J.等著,杨晓云等译,北京,机械工业出版社,2003.3 目录: 第1章求职过程1 1.1 与公司进行接触1 1.2 筛选面试3 1.3 正式面试3 1.4 衣着4 1.5 职业中介4 1.6 工作邀约和磋商5 1.7 接受或拒绝工作邀约7 第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 插入与删除22 3.2 双向链表24 3.3 循环链表24 3.4 面试例题:堆栈的实现25 3.5 面试例题:链表的尾指针31 3.6 面试例题:对RemoveHead函数进行纠错37 3.7 面试例题:链表中的倒数第m个元素39 3.8 面试例题:链表的扁平化42 3.9 面试例题:空链表与循环链表48 第4章树和图53 4.1 树53 4.1.1 二元树54 4.1.2 二元搜索树55 4.1.3 堆57 4.1.4 常用的搜索方法58 4.1.5 遍历58 4.2 图59 4.3 面试例题:左遍历59 4.4 面试例题:左遍历,不使用递归60 4.5 面试例题:最低公共祖先63 第5章数组与字符串65 5.1 数组65 5.1.1 C / C++ 66 5.1.2 Java 67 5.1.3 Perl67 5.2 字符串68 5.2.1 C 68 5.2.2 C++ 68 5.2.3 Java 69 5.2.4 Perl 69 5.3 面试例题:第一个无重复字符69 5.4 面试例题:删除特定字符72 5.5 面试例题:颠倒单词的出现顺序76 5.6 面试例题:整数/字符串之间的转换81 第6章递归算法87 6.1 面试例题:二分法搜索91 6.2 面试例题:字符串的全排列93 6.3 面试例题:字符串的全组合98 6.4 面试例题:电话键单词101 第7章其他程序设计问题109 7.1 计算机图形109 7.2 位操作符110 7.3 结构化查询语言112 7.4 并发程序设计技术115 7.5 面试例题:绘制八分之一圆形117 7.6 面试例题:矩形是否重叠120 7.7 面试例题:字节的升序存储和降序存储方式124 7.8 面试例题:“1”的个数126 7.9 面试例题:简单的SQL查询129 7.10 面试例题:公司和员工数据库129 7.11 面试例题:最大值,不允许使用统计功能131 7.12 面试例题:生产者/消费者问题132 第8章与计数、测量、排序有关的智力题139 8.1 面试例题:开锁143 8.2 面试例题:三个开关145 8.3 面试例题:过桥146 8.4 面试例题:找石头149 第9章与图形和空间有关的智力题153 9.1 面试例题:船和码头154 9.2 面试例题:数方块156 9.3 面试例题:狐狸与鸭子159 9.4 面试例题:导火索161 9.5 面试例题:躲火车163 第10章计算机基础知识165 10.1 个人简历165 10.2 答题要点165 10.3 面试例题:C++和Java 166 10.4 面试例题:头文件167 10.5 面试例题:存储类别167 10.6 面试例题:friend类168 10.7 面试例题:类与结构168 10.8 面试例题:父类与子类169 10.9 面试例题:参数传递170 10.10 面试例题:宏与内嵌函数171 10.11 面试例题:继承173 10.12 面试例题:面向对象的程序设计173 10.13 面试例题:与线程有关的程序设计问题174 10.14 面试例题:废弃内存的自动回收175 10.15 面试例题:32位操作系统177 10.16 面试例题:网络性能177 10.17 面试例题:高速磁盘缓存177 10.18 面试例题:数据库的优点178 10.19 面试例题:加密技术178 10.20 面试例题:新的加密算法179 10.21 面试例题:哈希表与二元搜索树1 7 9 第11章非技术问题181 11.1 答题要点181 11.2 问题:你打算从事哪方面的工作? 182 11.3 问题:你最喜欢的程序设计语言是哪一种? 183 11.4 问题:你的工作习惯是怎样的?184 11.5 问题:可以说说你的个人经历吗?184 11.6 问题:你的职业目标是什么? 184 11.7 问题:你为什么要换工作? 184 11.8 问题:你希望拿多少报酬? 185 11.9 问题:你以前的报酬水平是多少? 187 11.10 问题:我们为什么要雇佣你? 188 11.11 问题:你有什么问题想问我吗?188 附录写个人简历的方法189 VII

69,371

社区成员

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

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