数据结构课程设计Word下载.doc
《数据结构课程设计Word下载.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计Word下载.doc(15页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计Word下载.doc](https://file1.bdocx.com/fileroot1/2022-10/4/f8c7e001-adeb-473e-b9c9-38a239e6ddbb/f8c7e001-adeb-473e-b9c9-38a239e6ddbb1.gif)
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
测试用例见题集p116。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:
1、问题描述
简述题目要解决的问题是什么。
2、设计
存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;
3、调试报告
调试过程中遇到的问题是如何解决的;
对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)
5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,
6、设计报告、程序不得相互抄袭和拷贝;
若有雷同,则所有雷同者成绩均为0分。
时间安排:
1、第17周(6月17日至6月21日)完成。
2、6月21日14:
00到计算中心检查程序、交课程设计报告、源程序(CD盘)。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
文学研究助手
一、问题描述:
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
英文小说存于一个文本文件中。
二、需求分析:
1、文本串非空且以文件形式存放,统计匹配的词集非空。
文件名和词集均由用户从键盘输入;
2、“单词”定义:
由字母构成的字符序列,中间不含空格字符且区分大小写;
3、待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;
4、在计算机终端输出的结果是:
单词,出现的次数,出现的位置所在行的行号,同一行出现两次的只输出一个行号;
5、测试数据
以你的C源程序模拟英文小说,C语言保留字集作为待统计的词汇集:
ifelseforwhilereturnvoidintchartypedefstructdefine
sizeofdeleteinclude
三.概要设计
1、存储结构设计
#defineSIZE20
typedefFILE*PFILE;
typedefcharString[SIZE];
typedefstruct//单词类型
{
Stringdata;
//单词串
intlen;
//单词的长度
}WordType;
typedefstructWordNode//单词结点类型
{
WordTypedata;
WordNode*next;
}WordNode,*PWordNode;
typedefstructRowLink//表示文本每一行的链表
WordNode*head,*tail;
}RowLink,*RLink;
typedefstructRowNumNode//行号结点类型
intelem;
//行号
RowNumNode*next;
}RowNumNode,*RowNumLink;
typedefstructSearchWordNode//待搜索的单词结点类型
WordTypedata;
//待搜索单词
intcount;
//待搜索单词出现的次数
RowNumLinkRNhead,RNtail;
//存放文本中出现待搜索单词行号的链表
SearchWordNode*next;
}SearchWordNode,*SWLink;
structSWLinkList//待搜索的单词集合的链表并用来存储统计结果
SWLinkhead,tail;
};
2、主要算法设计描述
下列函数中较容易实现的未给出步骤
(1)voidCopyWord(WordType&
w,Stringch)
把字符串ch复制到单词元素w
(2)intMatchWord(WordTypew1,WordTypew2)
单词的匹配,若相等则返回1,否则返回非0
(3)voidMakeWordNode(PWordNode&
PN)
生成一个单词结点
(4)voidInsertAfter(RowLink&
L,WordTypew)
用后插法把单词结点w插入链表L
MakeWordNode(L.tail->
next);
L.tail->
next->
data=w;
L.tail=L.tail->
next;
(5)voidDestroyWordLink(RowLink&
L)
销毁链表L
(6)voidCreateWordLink(RowLink&
L,FILE*f)
创建存放f指向文本每中一行单词的链表
该函数的主要步骤:
Stringch;
charc=getc(f);
WordTypew;
charc=getc(f);
//从文件中读取一个字符
MakeWordNode(L.head);
//调用该函数生成文件行单词链表的头结点
L.tail=L.head;
while(c!
='
\n'
&
!
feof(f))//c不是换行,文件也未结束
while(!
(c>
A'
c<
Z'
||c>
a'
z'
)&
c!
feof(f))//滤去非法字符
c=getc(f);
for(inti=0;
c>
;
i++)//取单词,
{
ch[i]=c;
c=getc(f);
}
ch[i]='
\0'
CopyWord(w,ch);
//将获取的字符串复制到单词型的变量中
InsertAfter(L,w);
//将获取的该单词插入到链表中
}
(7)voidMakeRowNumNode(RowNumLink&
p)
生成一个行结点
(8)voidMakeSWNode(SWLink&
生成一个待搜索的单词结点
(9)voidCreateSWLinkList(SWLinkList&
S)
建立一个待搜索的单词链表
(10)voidOutputSWLinkList(SWLinkListS)
输出待搜索的单词链表的在文本中出现的次数和行号
(11)voidOpenFile(PFILE&
f,Stringch)
打开文件,ch表示文件的路径及名称
(12)中心函数描述
voidMatchSWLinkList(SWLinkList&
S,FILE*f)
查找文本中出现待搜索的单词的次数和行号)
该函数是求解该问题的主演函数,其主要步骤为:
i=0//记录行号
while(!
(feof(f)))//文件未结束
{
i++;
CreateWordLink(RL,f);
//创建文本的该行单词链表
ps=S.head->
//ps指向此时被搜索的单词
while(ps)//当ps所指单词不为空,在本行中查找其出现的次数
{
pr=RL.head->
//该指针指向文件该行的链表
intlabel=1;
//用于标志待搜索单词在本行中是否是第一次出现,若是须创建一行结点,若不是,直接count+1
while(pr)//本文中一行单词链表的每个结点依次与被搜索的单词比较
{
if(MatchWord(pr->
data,ps->
data))
{
ps->
count++;
if(label==1)是该正在搜索指针所指的
{
创建统计被搜索单词行号的链表 ,记录此时的行号 label=0;
}
}
pr=pr->
//指向本行中下一个单词并进行比较
}
ps=ps->
//对待搜索的下一个单词进行统计
}
DestroyWordLink(RL);
//销毁已被搜索过的文件中该行单词的链表
}
四、调试报告
调试过程中遇到的问题及解决方案:
(1)对单词类型WordType进行定义时,原本想采用字符数组对data进行定义,但是对字符数组的操作不如对字符串操作方便,故改用字符串。
(2)在创建文件中每一行单词的链表以及待测试的单词的链表,及创建待测试的单词的链表时,原本按照生成头结点,然后再生成结点依次插入,但发现在其它函数中也用到生成结点,这导致程序冗杂,故把生成结点写成一个独立的函数,供其它函数调用。
(3)在统计被测试单词在每一行中出现的次数时,若该单词在一行中出现了两次,统计时发生了错误。
后经修改,设置了一个label标志,用于标志待搜所单词在本行中是否是第一次出现,若是,须创建一行结点,记录行号,若不是,直接count自增1,而无需再生成一个行结点。