数据结构的一考题,求完整运行代码。能在VS2008 或者 VC++6.0上面运行(有详细题目分析)

题目:
设键盘输入n个英语单词,输入格式为n, w1, w2, …,wn,其中n表示随后输入英语单词个数,试编一程序,建立一个单向链表,实现:
(1)如果单词重复出现,则只在链表上保留一个。
(2)除满足(1)的要求外。链表结点还应有一个计数域,记录该单词重复出现的次数,然后输出出现次数最多的前k(k<=n)个单词。

要求:英文单词是字符串,能直接在VC++6.0 或者 vs2008上运行。

[题目分析] 本题链表结点的数据域存放英文单词,可用字符数组表示,单词重复出现时,链表中只保留一个,单词是否相等的判断使用strcmp函数,结点中增设计数域,统计单词重复出现的次数。
typedef struct node
{int freg;//频度域,记单词出现的次数。
char word[maxsize];//maxsize是单词中可能含有的最多字母个数。
struct node *next;
}node, *LinkedList;
(1)LinkedList creat()
//建立有n(n>0)个单词的单向链表,若单词重复出现,则只在链表中保留一个。
{LinkedList la;
la=(LinkedList)malloc(sizeof(node));//申请头结点。
la->next=null; //链表初始化。
for(i=1;i<=n;i++) //建立n个结点的链表
{scanf(“%s”,a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;pre=p; //p是工作指针,pre是前驱指针。
while(p!=null)
if(strcmp(p->data,a)==0) {p->freg++;break;} //单词重复出现,频度增1。
else {pre=p;p=p->next;} //指针后移。
if(p==null) //该单词没出现过,应插入。
{p=(LinkedList)malloc(sizeof(node));
strcopy(p->data,a);p->freg=1;p->next=null;pre->next=p;
} //将新结点插入到链表最后。
}//结束for循环。
return(la);
}//结束creat算法。
(2) void CreatOut( )
//建立有n个单词的单向链表,重复单词只在链表中保留一个,最后输出频度最高的k个单词。
{LinkedList la;
la=(LinkedList)malloc(sizeof(node));//申请头结点。
la->next=null; //链表初始化。
for(i=1;i<=n;i++) //建立n个结点的链表
{scanf(“%s”,a); //a是与链表中结点数据域同等长度的字符数组。
p=la->next;pre=p; //p是工作指针,pre是前驱指针。
while(p!=null)
if(strcmp(p->data,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; //将p结点插入到合适位置
}
else {pre=p;p=p->next;} //指针后移。
if(p==null) //该单词没出现过,应插入到链表最后。
{p=(LinkedList)malloc(sizeof(node));
strcopy(p->data,a);p->freg=1;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->data,p->freg);
p=p->next;
}
if (!p)
printf(“给出的%d值太大\n”,k);
}//结束算法

我不看提示了,自己重新写个。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define SIZE sizeof(struct Word)
#define MAXSIZE 50
typedef struct Word
{
char word[MAXSIZE];
struct Word *next;
int count;
}word;
typedef struct
{
int count;
word *head;
}wordlist;
void ini(wordlist* words)
{
words->count=0;
words->head=(word*)malloc(SIZE);
words->head->next=NULL;
}
void newNode(word *p,char *newWord)
{
p->next=(word*)malloc(SIZE);
p=p->next;
p->count=1;
strcpy(p->word,newWord);
p->next=NULL;
}
void Add(wordlist* words,char *newWord)
{
word *p=words->head;
while(p->next!=NULL)
{
if(!strcmp(p->word,newWord))
{
p->count++;
return;
}
p=p->next;
}
newNode(p,newWord);
words->count++;
}
void drop(wordlist* words)
{
word *p=words->head;
word *q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=q->next;
}
}
void copy(word *array,wordlist* words)
{
int i;
word *p;
for(i=0,p=words->head->next;i<words->count;i++,p=p->next)
{
array[i]=*p;
}
//printf("OK\n");
}
int cmp(const void *a,const void *b)
{
word *p=(word*)a;
word *q=(word*)b;
return p->count-q->count;
}
/*void print(wordlist *words)
{
word *p=words->head;
printf("单词个数为:%d\n",words->count);
while(p->next!=NULL)
{
printf("%s\n",p->next->word);
p=p->next;
}
}*/
int main()
{
char aword[MAXSIZE];
wordlist words;
int n,k,i;
word *array;
ini(&words);
printf("请输入单词的个数\n");
scanf("%d",&n);
while(n--)
{
scanf("%s",aword);
Add(&words,aword);
}
array = (word*)malloc(SIZE * words.count);
copy(array,&words);
qsort(array,words.count,sizeof(array[0]),cmp);
printf("需要输出出现次数前多少个的单词呢?\n");
scanf("%d",&k);
for(i=0;i<k;i++)
{
printf("%s ",array[i].word);
}
printf("\n");
drop(&words);
free(array);
return 0;
}
/*
6
I am a big big girl
3
*/
楼主一定要给分哦
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-22
题目分析。。。难道一定要按照题目分析里的结构编程?追问

那是参考答案····基本需要的东西都有··却一些定义··还有#include``
最好按照 分析里面的机构编程吧··
不然我怕我搞不懂。。。

追答

http://zhidao.baidu.com/question/271935607.html
刚好我在另一个问题里回答了,请看最佳答案。看来是同一个问题,莫非是经典问题?

第2个回答  2011-05-24
都分析的这么清楚了 基本吧上面的代码抄一边追问

试过了··当中 P的指针不知道为什么会指向DATA 还有有一个while 后面两个括号··不晓得什么意思。
一直调试都出错。。
求助··我的QQ490054

第3个回答  2011-05-22
这个要得自己做啊,不做砸提高
相似回答