基于线性表和二叉排序树的低频词过滤系统

Posted suxinpaul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于线性表和二叉排序树的低频词过滤系统相关的知识,希望对你有一定的参考价值。

 

 

 

数据结构课程设计报告

 

基于线性表和二叉排序树的低频词过滤系统

——采用的方法

 

 

 

 

 

班   级:        计算机软件101        

姓   名:            **                  

指导教师:                                 

成   绩:                                  

 

 

 

 

 

 

 

 

                               信息工程学院

 

                    2012  年  6  月  12  日

 

 


运行前,请在文件保存目录下建立inFile.txt文件

inFile.txt

The importance of self-confidence Currently, self-confidence has been the order of the day. This does demonstrate the theory —— nothing is more valuable than self-confidence. It is clear that (self-confidence means trust in one's abilities). If you (are full of self-confidence, it will bring your creative power to play, arouse your enthusiasm for work, and help you overcome difficulties), as a result, your dreams will come true. On the contrary, if you (have no confidence in yourself, there is little possibility that you would ever achieve anything ). Failure will be following with you。It turns out that all your plan falls through. No one can deny another fact that (self-confidence gives you light when you are in dark and encouragement when you are dismayed).You don't have to look very far to find out the truth, in respect that we all know (the secret of MMe. Curie lies in perseverance and self-confidence, the latter in particular). It will exert a profound influence upon (the achievement of one's ambitions). With reference to my standpoint, I think (he that can have self-confidence can have what he will).

 

目  录

 

1 前言·· 1

2需求分析··2

3概要设计(特殊功能)··2

4详细设计··2

5源代码及调试··3

6特殊问题解决方法··9

7使用说明及测试结果··10

8结论··10

9总结与体会··11

10参考文献··12

 

               

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 前言

1.1 课题简介

课程设计题目名称:

基于线性表和二叉排序树的低频词过滤系统

课程设计目的:

通过《数据结构》课程的学习,将数据结构应用在具体的编程方面,更加了解课程所学习的内容及思维逻辑。

课程设计意义:

利用数据结构课程设计,了解学生对《数据结构》的理解和加强学生对数据结构方面的应用知识。希望今后学生好好利用数据结构的知识和思想,解决各方面的编程难题。

课程设计内容:

对于一篇给定的英文文章,分别利用线性表和二叉排序树来实现单词频率的统计,实现低频词的过滤,并比较两种方法的效率。

课程设计要求:

1. 读取英文文章文件(InFile.txt),识别其中的单词。

2. 分别利用线性表和二叉排序树构建单词的存储结构。当识别出一个单词后,若线性表或者二叉排序树中没有该单词,则在适当的位置上添加该单词;若该单词已经被识别,则增加其出现的频率。

3. 统计结束后,删除出现频率低于五次的单词,并显示该单词和其出现频率。

4.其余单词及其出现频率按照从高到低的次序输出到文件中(OutFile.txt),同时输出用两种方法完成该工作所用的时间。

5.计算查找表的ASL值,分析比较两种方法的效率。

6.系统运行后主菜单(仅供参考)如下:

当选择1后进入以下界面:

其中选择2时显示利用线性表来实现所有功能所用的时间。

当在主菜单选择2二叉排序树后,进入的界面与上图类同。

 

1.2 方案及其论证

    语言:C

      运行环境:C-Free5.0

      可行性分析:建立单链表存储InFile.txt英语文章单词及频率,建立二叉排序树存储InFile.txt英语文章单词和频率,分别实现单词统计,删除频率低的单词,输出其余单词,并计算ASL值。

设计进度安排:

第一天

第二天

第三天

第四天

第五天

设计系统界面,查找资料

完成初步的程序设计

查资料解决调试中的问题

答疑,改进程序

验收并完成报告

 

 

 

 

 

 

 

 

 

 

 

 

2需求分析

    建立单链表存储InFile.txt英语文章单词及频率,建立二叉排序树存储InFile.txt英语文章单词和频率,分别实现单词统计,删除频率低的单词,用outFile.txt文本输出其余单词,并计算ASL值。

根据第一个要求,系统实现是没有问题的,简单易行;第二个要求可以通过运算符号来实现,也是简单易行的;第三个要求实现较为困难,需要通过严密的思维逻辑一一实现完成,是本次编程的重难点。

 

3概要设计(特殊功能)

 

 

4详细设计

 

5源代码及调试

 

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include <time.h>
typedef struct node1		//单链表节点 
	char data[20];
	int count;
	struct node1 *next;
LNode,*LinkList;
typedef struct node2//排序二叉树节点 

	char data[20];
	int count;
	struct node2* left;
	struct node2* right;
BSTNode, *BSTree;
BSTree T,nT;
typedef struct stack//非递归中序遍历写入文件outFile.txt 

	BSTree data[1000];
	int top;
seqstack;
/***************************************************************************************///单链表 
void swap(LinkList x,LinkList y)

	char a[20];
	strcpy(a,x->data);
	int b=x->count;
	
	strcpy(x->data,y->data);
	x->count=y->count;
	
	strcpy(y->data,a);
	y->count=b;	

void sort_slist(LinkList &L)

	LinkList p,q,temp;
	p=L->next;
	while(p)
	
		q=p->next;
		while(q)
		
			if(p->count<q->count)
			
				swap(p,q);
			
			else 
				q=q->next;
		
		p=p->next;
	

void InitList(LinkList &L)

	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;

int InsertList(LinkList &L,char *a)//先将每一元素存入线性链表中,然后统计个数 

	int flag=0;
	LinkList P;
	LinkList Q;
	Q=L->next;
	while(Q!=NULL)
	
		if(!strcmp(a,Q->data))
		
			Q->count++;
			flag=1;
			break;
		
		Q=Q->next;
	
	if(!flag)
	
		P=(LinkList)malloc(sizeof(LNode));
		strcpy(P->data,a);
		P->count=1;
		P->next=L->next;
		L->next=P;
		
	

int LNodeprint(LinkList &L)

	LinkList P;
	P=L->next;
	printf("单词       个数统计\\n"); 
	while(P!=NULL)
	
		printf("%-10s    %d\\n",P->data,P->count);
		P=P->next;
	 

void fprint1(LinkList &L)
	
	LinkList P;
	FILE *out;
	out=fopen("outFile.txt","a+");//建立输出文件
	fprintf(out,"单链表删除个数<5的单词:\\n");
	P=L->next;
	while(P)
	
		fprintf(out,"%s (%d)\\t",P->data,P->count);
		P=P->next;
	
	fclose(out);

int single_distinguish_count1()

    FILE *in;
    char a[20],c;
    LinkList L;
    InitList(L);
    in=fopen("inFile.txt","r");//打开输入文件
    while(!feof(in))//直到碰见文件结束符结束循环
    
    	int i=0;
    	memset(a,0,sizeof(a));
		while((c=fgetc(in))!=EOF&&!(c==','||c=='.'||c=='!'||c=='?'||c==' '||c=='('||c==')'))
		
			a[i++]=c;
		
		if(a[0])
		InsertList(L,a);
    
	sort_slist(L);
	LNodeprint(L);
    fclose(in);//关闭文件	

void deletenode(LinkList &L)

	LinkList P,Q;
	FILE *out;
	out=fopen("outFile.txt","w+");//建立输出文件
	P=L->next;
	while(P&&P->count>=5)
	
		P=P->next;
	
	while(P)
	
		Q=P;
		P=P->next;
		printf("删除节点: %-10s  %d\\n",Q->data,Q->count);
		free(Q);
	

int single_delete1()

    FILE *in;
    int j=1;
    char a[20],c;
    LinkList L;
    InitList(L);
    in=fopen("inFile.txt","r");//打开输入文件
    while(!feof(in))//直到碰见文件结束符结束循环
    
    	int i=0;
    	memset(a,0,sizeof(a));
		while((c=fgetc(in))!=EOF&&!(c==','||c=='.'||c=='!'||c=='?'||c==' '||c=='('||c==')'))
		
			a[i++]=c;
		
		if(a[0])
		
			InsertList(L,a);
				
    
	sort_slist(L);	
	printf("删除低频词汇\\n");
	deletenode(L);

void outnode(LinkList &L)

	LinkList P,Q;
	FILE *out;
	out=fopen("outFile.txt","w+");//建立输出文件
	P=L->next;
	printf("删除低频率单词后\\n单词       个数统计\\n"); 
	while(P&&P->count>=5)
	
		printf("%-10s  %d\\n",P->data,P->count);
		fprintf(out,"%s(%d)\\t",P->data,P->count);
		P=P->next;
	
	printf("写入文件outFile.txt成功\\n");	

void single_output1()

    FILE *in;
    int j=1;
    char a[20],c;
    LinkList L;
    InitList(L);
    in=fopen("inFile.txt","r");//打开输入文件
    while(!feof(in))//直到碰见文件结束符结束循环
    
    	int i=0;
    	memset(a,0,sizeof(a));
		while((c=fgetc(in))!=EOF&&!(c==','||c=='.'||c=='!'||c=='?'||c==' '||c=='('||c==')'))
		
			a[i++]=c;
		
		if(a[0])
		
			InsertList(L,a);
				
    
	sort_slist(L);
	outnode(L);
    fclose(in);//关闭文件

int sumNode(LinkList &L)

	int sum=0;
	LinkList p;
	p=L->next;
	while(p)
	
		sum++;
		p=p->next;
	
	return sum;

int single_ASL1()

    FILE *in;
    int sum;
    char a[20],c;
    LinkList L;
    InitList(L);
    in=fopen("inFile.txt","r");//打开输入文件
    while(!feof(in))//直到碰见文件结束符结束循环
    
    	int i=0;
    	memset(a,0,sizeof(a));
		while((c=fgetc(in))!=EOF&&!(c==','||c=='.'||c=='!'||c=='?'||c==' '||c=='('||c==')'))
		
			a[i++]=c;
		
		if(a[0])
		
			InsertList(L,a);
				
    
    sum=sumNode(L);
	printf("单词总个数:%d\\n",sum);
    fclose(in);//关闭文件
	printf("ASL = %.2f \\n",double(3*(sum+1)/4.0));

int continue_to_finish1()

	single_distinguish_count1();
	single_delete1();
	single_output1();
	single_ASL1();

int show_time1()

	double star,finish;
	star=(double)clock();//获取当前时间
	single_distinguish_count1();
	single_delete1();
	single_output1();
	single_ASL1();
	finish=(double)clock();//获取结束时间
	printf("执行时间:%.2f ms\\n",(finish-star));//得到的是运行for语句所用的时间,时间单位了毫秒	

/*******************************************************************************///排序二叉树
void insertNode(BSTree &T,char *a)

	if (T==NULL)
	
	   	T=(BSTree)malloc(sizeof(BSTNode));
	   	strcpy(T->data,a);
	   	T->left=NULL;
	   	T->right=NULL;
	   	T->count=1;
	
	else
	
	   	if(strcmp(a,T->data)<0)
	   	
			insertNode(T->left,a);
	   	
  		else if(strcmp(a,T->data)==0)
  		
		  	T->count++;
		  
	   	else
	   	
	    	insertNode(T->right,a);
	   	
	

void printTree(BSTree T)//中序遍历二叉排序树,得到有序序列

	if(T)
	
	   printTree(T->left);
	   printf("%-10s   %d\\n",T->data,T->count);
	   printTree(T->right);
	

void fprint2(BSTree T)

	FILE *out;
	seqstack S;
	S.top=-1;
	out=fopen("outFile.txt","a+");//建立输出文件
	fprintf(out,"排序二叉树删除个数 < 5 的单词:\\n");
	while(T||S.top!=-1)
	
		while(T)
		
			S.top++;
			S.data[S.top]=T;
			T=T->left;
		
		if(S.top>-1)
		
			T=S.data[S.top];
			S.top--;
			fprintf(out,"%s (%d)\\t",T->data,T->count);
			T=T->right;
		
	
	fclose(out);

int single_distinguish_count2()

    FILE *in;
    T=NULL;
    in=fopen("inFile.txt","r");//打开输入文件
    char a[20],c;
    while(!feof(in))//直到碰见文件结束符结束循环
    
    	int i=0;
    	memset(a,0,sizeof(a));
		while((c=fgetc(in))!=EOF&&!(c==','||c=='.'||c=='!'||c=='?'||c==' '||c=='('||c==')'))
		
			a[i++]=c;
		
		if(a[0])
		insertNode(T,a);
       
    printf("中序遍历二叉排序树\\n");
    printf("单词       个数统计\\n"); 
    printTree(T);

BSTree insertTree(BSTree &nT,BSTree T)//中序遍历二叉排序树,得到有序序列

	if (nT==NULL)
	
	   	nT=(BSTree)malloc(sizeof(BSTNode));
	   	strcpy(nT->data,T->data);
		nT->count=T->count;
	   	nT->left=NULL;
	   	nT->right=NULL;
	
	else
	
	   	if(strcmp(T->data,nT->data)<0)
	   	
			insertTree(nT->left,T);
	   	
	   	else
	   	
	    	insertTree(nT->right,T);
	   	
	
	return nT;	

void newBSTree(BSTree T)//中序遍历二叉排序树,得到有序序列

	if(T)
	
	   newBSTree(T->left);
	   if(T->count>=5)
	   
   			insertTree(nT,T);
	   	   
	   newBSTree(T->right);
	

int single_delete2()

	printf("删除<5的二叉排序树中序遍历:\\n");
	nT=NULL;
	newBSTree(T);
	printf("单词       个数统计\\n"); 
	printTree(nT);

void single_output2()

	printf("单词       个数统计\\n"); 
	printTree(nT);
	printf("写入文件outFile.txt成功\\n");	
	fprint2(nT);

int calculateASL(BSTree T,int *s,int *j,int i) /*计算平均查找长度*/

	if(T)
	 
		i++; *s=*s+i; 
		if(calculateASL(T->left,s,j,i)) 
		 
			(*j)++; 
			if(calculateASL(T->right,s,j,i))
			
				i--; return(1);
			
		
	 
	else return(1);

int single_ASL2()

	int s=0,j=0,i=0;
	calculateASL(T,&s,&j,i);
	printf("ASL = %d / %d \\n",s,j);
	

int continue_to_finish2()

	single_distinguish_count2();
	single_delete2();
	single_output2();
	single_ASL2();	

int show_time2()

	double star,finish;
	star=(double)clock();//获取当前时间
	single_distinguish_count2();
	single_delete2();
	single_output2();
	single_ASL2();
	finish=(double)clock();//获取结束时间
	printf("执行时间:%.2f ms\\n",(finish-star));//得到的是运行for语句所用的时间,时间单位了毫秒	

/*******************************************************************************///菜单设置 
void print1()

	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n");	
	printf("★                            主菜单                                          ★ \\n");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n\\n");	
	printf("                         ☆ 1.线性表\\n");
	printf("                         ☆ 2.二叉排序树\\n");
	printf("                         ☆ 3.退出系统\\n");
	printf("请输入你的选择:"); 

void print2()

	printf("			☆ 1.连续执行至完毕\\n");
	printf("			☆ 2.显示执行时间\\n");
	printf("			☆ 3.单步执行:识别并统计单词\\n");
	printf("			☆ 4.单步执行:删除并显示出现频率低的单词\\n");
	printf("			☆ 5.单步执行:输出其余单词及其频率\\n");
	printf("			☆ 6.单步执行:计算并输出ASL\\n");
	printf("			☆ 7.返回主菜单\\n");
	printf("请输入你的选择:"); 	

int mainmenu();
int Link()

	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n");	
	printf("★                            线性表选择菜单                                  ★ \\n");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n\\n");	
	print2();
	int n;	
	scanf("%d",&n);
	while(!(n==1||n==2||n==3||n==4||n==5||n==6||n==7))
	
		printf("输入有误,请重新输入\\n");
		scanf("%d",&n);
	
	system("cls");
	switch (n)
	
		case 1:
			continue_to_finish1();
			Link();
			break;
		case 2:
			show_time1();
			Link();
			break;
		case 3:
			single_distinguish_count1();
			Link();
			break;
		case 4:
			single_delete1();
			Link();
			break;
		case 5:
			single_output1();
			Link();
			break;
		case 6:
			single_ASL1();
			Link();
			break;
		case 7:
			mainmenu();
			break;			
	

int Tree()

	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n");	
	printf("★                            二叉排序树选择菜单                              ★ \\n");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\\n\\n");	
	print2();
	int n;	
	scanf("%d",&n);
	while(!(n==1||n==2||n==3||n==4||n==5||n==6||n==7))
	
		printf("输入有误,请重新输入\\n");
		scanf("%d",&n);
	
	system("cls");
	switch (n)
	
		case 1:
			continue_to_finish2();
			Tree();
			break;
		case 2:
			show_time2();
			Tree();
			break;
		case 3:
			single_distinguish_count2();
			Tree();
			break;
		case 4:
			single_delete2();
			Tree();
			break;
		case 5:
			single_output2();
			Tree();
			break;
		case 6:
			single_ASL2();
			Tree();
			break;
		case 7:
			mainmenu();
			break;			
		

int mainmenu()

	print1();
	int n;
	scanf("%d",&n);
	while(!(n==1||n==2||n==3))
	
		printf("输入有误,请重新输入\\n");
		scanf("%d",&n);
	
	system("cls");
	switch (n)
	
		case 1: 			
			Link();
			mainmenu();
			break;
		case 2: 
			Tree();
			mainmenu();
			break;
		case 3: 
			printf("退出系统\\n");
			exit(0);
	 	
 
int main()

	mainmenu();


调试过程中曾遇到的错误:

 

 

 

6特殊问题解决方法

 

 

 

7使用说明及测试结果

 

 

8结论

 

 

9总结与体会

 

 

指导教师意见:

 

 

 

 

 

签名:

日期:


 



以上是关于基于线性表和二叉排序树的低频词过滤系统的主要内容,如果未能解决你的问题,请参考以下文章

哈希表在遍历链式结构中的运用--以链表和二叉树的遍历为例

c语言——链表和二叉树

二叉树的先序/中序/后序/层次遍历

算法之二叉树各种遍历

排序:Java实现大顶堆和二叉树的广度优先遍历原理及代码注释详解

树和二叉树的相关概念