单向链表,输入n个英文单词,统计出现次数,链表不保留重复。请高手帮忙!!!
键盘输入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);
}