问题描述
- 数据结构预算法 要求统计自己输入文本的数字字母或者文字的个数 把学生独立完成部分填上
- #include
#include
#include
#include
#include
#define MAXSIZE 1000
#define MAXLEN 20
#define MAXNUM 16
#define FALSE 0
#define TRUE 1
/*---------------堆结构的定义---------------*/
typedef struct{
char stores[MAXSIZE];
int freep; //当前可用空间开始位置
}HeapSpace;
HeapSpace sp;
/*-------------单词数据类型定义-------------*/
/*-----------单词在堆中的位置描述-----------*/
typedef struct{
int stadr; //单词在对空间中的开始位置
int len; //单词长度
}WordType;
/*----------------单词描述-------------------*/
typedef struct{
char ch[MAXLEN]; //单词字符串
int size; //单词长度
}Sequence;
/*---------------有序表类型定义---------------*/
/*-------------单词有序表结点定义-------------*/
typedef WordType ElemType;
typedef struct NodeType{
ElemType data;
struct NodeType next;
}NodeType*LinkType;
/----------------单词有序表定义--------------*/
typedef struct{
LinkType head; //有序表头指针
LinkType tail; //有序表尾指针
int size; //有序表结点个数
}OrderList;
/*---记录一行中匹配成功单词在目标词汇表中的位置---*/
typedef struct{
int eqelem[MAXNUM]; //单词在目标词汇表中的位置
int last; //匹配成功单词的个数
}EqelemList;
/*-----------文件测试相关的数据类型定义-----------*/
/*--------------单词在文件中的位置----------------*/
typedef struct Node{
int elem; //被测单词在文件中的行号
struct Node next;//指向下一个行号结点的指针
}Node*Link;
/-----------单词统计分析记录结构定义-------------*/
typedef struct{
WordType data; //被测试的单词
int count; //在文件中出现的次数
Link next; //记录出现的所有行号的脸表头指针
}HeadNode;
/*---------文本文件测试结果记录定义---------------*/
typedef HeadNode ResultType[MAXNUM];
typedef int status;
/*------------与单词相关的函数----------------*/
status NewWord(WordType nwSequence cha)
{ int ik;
if(sp.freep+cha.size>=MAXSIZE)
{ printf(""Heap Full!n"");
getchar();
return(0);
}
else{
i=sp.freep;
sp.freep=sp.freep+cha.size;
for(k=0;k sp.stores[i+k]=cha.ch[k];
nw->stadr=i;
nw->len=cha.size;
return(1);
}
}
void CopyWord(WordType *nwWordType oldw)
{ nw->stadr=oldw.stadr;
nw->len=oldw.len;
}
int WordCmp(WordType wd1WordType wd2)
{ int ksisj;
(学生独立完成)
}
void PrintWord(WordType wd)
{ int i;
for(i=0;i<wd.len;i++)
putchar(sp.stores[wd.stadr+i]);
}
/---------------与有序表相关的函数-----------*
status MakeNode(LinkType pElemType e)
{ *p=(LinkType)malloc(sizeof(NodeType));
if(!(*p)) return(FALSE);
(*p)->data.stadr=e.stadr;
(*p)->data.len=e.len;
(*p)->next=NULL;
return(TRUE);
}
status InitList(OrderList *L)
{ ElemType wd;
wd.len=0;
if(MakeNode(&(L->head)wd))
{ L->tail=L->head;
L->head->next=NULL;
L->size=0;
return(TRUE);
}
else{ L->head=NULL;
return(FALSE);
}
}
void DestroyList(OrderList *L)
{ LinkType pq;
p=L->head;
while(p){
q=p;p=p->next;
free(q);
}
L->head=L->tail=NULL;
}
status LocateElem(OrderList LElemType eLinkType *q)
{ LinkType prep;
(学生独立完成)
}
void InsertAfter(OrderList *LLinkType qLinkType s)
{ if(L->head&&q&&s){
s->next=q->next;q->next=s;
if(L->tail==q) L->tail=s;
L->size++;
}
}
void ListCompare(OrderList LaOrderList LbEqelemList *s)
{ int pos;
LinkType papb;
if(La.head&&Lb.head){
pa=La.head->next;
pb=Lb.head->next;
s->last=pos=0;
while(pa&&pb){
if(WordCmp(pa->datapb->data)==0){
s->eqelem[s->last++]=pos++;
pa=pa->next;
pb=pb->next;
}
else if(WordCmp(pa->datapb->data)==-1){
pa=pa->next;
pos++;
}
else pb=pb->next;
}
}
}
status ListEmpty(OrderList L)
{ if(L.size==0) return(TRUE);
return(FALSE);
}
/-----------与文本文件有关的函数-------------*/
int feoln(FILE f)
{ char cha;
cha=fgetc(f);
ungetc(chaf);
if(cha=='n') return(TRUE);
return(FALSE);
}
void GetAWord(FILE *fSequence *st)
{ char ch;
(学生独立完成)
}
status ExtractWord(FILE *fOrderList *ta)
{ int i;
char lendc;
Sequence str;
WordType nwd;
LinkType p;
LinkType s;
(学生独立完成)
}
status match(FILE *fOrderList patResultType rs)
{ int iklinenumfailedfsp;
OrderList sa;
EqelemList eqlist;
Link p;
(学生独立完成)
}
status Initialization(FILE **fr)
{ char FileName[30];
printf(""Input file name:"");
do{ scanf(""%s""FileName);
}while(strlen(FileName)==0);
*fr=fopen(FileNamerb"");
if(*fr)
{ printf(""file open!n"");
return(TRUE);
}
else { printf(""file not open!n"");
return(FALSE);
}
}
void InputWord(OrderList *pt)
{ char cc;
Sequence ws;
LinkType pq;
WordType nwd;
(学生独立完成)
}
void InitRList(ResultType rsOrderList pat)
{ int k;
LinkType p;
p=pat.head->next;
for(k=0;kCopyWord(&rs[k].datap->data);
rs[k].next=NULL;
rs[k].count=0;
p=p->next;
}
}
void OutResult(ResultType rslistint n)
{ int ij;
Link p;
for(i=0;iprintf(""The word "");
PrintWord(rslist[i].data);
printf("" appeared in the file %d times""rslist[i].cou
if(rslist[i].count!=0){
printf("" and on "");
p=rslist[i].next;
for(j=0;jif(j{ printf(""%dp->elem);
p=p->next;
}
else printf(""%dn""p->elem);
}
}
}
void FreeResult(ResultType rsint n)
{ int i;
Link pq;
for(i=0;ip=rs[i].next;
while(p){
q=p;
p=p->next;
free(q);
}
rs[i].next=NULL;
rs[i].count=0;
}
}
int nemu()
{ int mun;
printf(""n ******** Literary research aid *********n"") ;
printf("" %8c1---Input matched words%9cn""' ''');
printf("" %8c2---Input match file%13cn""' ''');
printf("" %8c3---Proces file%17cn""' ''');
printf("" %8c4---Output Result%15cn""' ''');
printf("" %8c5---Quit%24cn""' ''');
printf("" *****************************************n"");
printf(""%15cSelcet 12345: ""' ');
do{
mun=getch()-48;
}while(mun5);
printf(""n"");
return(mun);
}
/*--------------------------------------------*/
/* 主函数 /
/--------------------------------------------*/
void main()
{ int ijflag1=0flag2=0flag3=0;
char str[80];
FILE *fp;
OrderList pt;
LinkType p;
ResultType rs;
sp.freep=0;
pt.size=0;
for(i=0;i<MAXNUM;i++) rs[i].next=NULL;
while(1)
{ switch(nemu())
{
93
case 1: //输入待统计的单词集
if(pt.size!=0) DestroyList(&pt);
InputWord(&pt);
if(!ListEmpty(pt)) flag2=1;
break;
case 2: //初始化文件
if(Initialization(&fp)) flag1=1;
break;
case 3: //统计分析
if(flag1==0||flag2==0)
{ printf(""file not processed!n"");
getchar();
break;
}
FreeResult(rspt.size);
InitRList(rspt);
if(!match(fpptrs))
{ printf(""memory overfllow!n"");
getchar();
break;
}
else flag3=1;
break;
case 4: //输出统计结果
if(flag3==0){
printf(""not result!n"");
getchar();
break;
}
OutResult(rspt.size);
break;
case 5: //退出系统
FreeResult(rspt.size);
DestroyList(&pt);
return;
}
}
}
解决方案
时间: 2024-11-03 11:41:14