救急!救急!   

     英文小说存于一个文本文件中。带统计的词汇集合要一次输入完毕,几统计工作必须在程序的一次运行只后就全部完成。 程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计 以C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集 每读如一行,就统计每个词在行中出现的次数,出现位置所在行的行号可以用链表存储。如某行中出现了不止一次,不必存多个相同的行号 每个字符串间是用回车键表示该行输入完毕的,不是空格键 。

本人写的代码如下:
#include<iostream.h>
#include<malloc.h>
#include <stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define MAX 100
#define m 5//保留字的个数
#define n 7//每个保留字的最大长度
#define p 2//源程序共有几行
typedef int ElemType;
typedef int status;

typedef struct 
{
    char ch[MAX];
    int length;
}HString;
typedef struct linknode
{
    ElemType data;
    struct linknode *next;
}LNode;
LNode *SetNULL()//初始化链表
{
    LNode *h;
    h=(LNode *)malloc(sizeof(LNode));
    h->next=NULL;
    return (h);
}
status ListInsert(LNode *h,ElemType e)//插入行号在链表尾结点
{
    LNode *p,*q;
    p=(LNode *)malloc(sizeof(LNode));
    p->next=NULL;
    p->data=e;
    q=h;
    while(q->next!=NULL)
        q=q->next;
    q->next=p;
    return OK;
}
status ListDelete(LNode *h)//删除第一个结点并用e返回该结点的值
{
    ElemType e;
    LNode *p;
    p=h->next;
    h->next=p->next;
    e=p->data;
    free(p);
    return (e);
}
status StrAssign(HString &T,char chars[])//初始化串
{
    strcpy(T.ch,chars);//拷贝字符数组到串中
    T.length=strlen(chars);
        return OK;
}
status clearString(HString &S)//销毁串
{
    char *cha;
    cha=S.ch;
    if(cha)
    {
        free(cha);
            S.length=0;
    }
    return OK;
}
status Index(HString &s1,HString &s2)//实现匹配功能
{
    int i,j,count=0;//count用于计算在一行中有几个该保留字
    i=j=0;
    while(s1.ch[i])
    {
        if(s1.ch[i]=='"')//如果是双引号就i++一直到另外一个双引号,是为了防止出现输出语句时引号有和保留字相同的单词
        {
            do
            {i++;}
            while(s1.ch[i]!='"');
                i++;
        }
        if(s2.ch[j]=='\0'&&s1.ch[i]<'a'&&s1.ch[i]>'z')//匹配成功
            {
            count++;
            i++;
            j=0;
        }
        else if(s1.ch[i]==s2.ch[j])
        {
               i++;
               j++;
        }
    else
    {
        i++;
        j=0;
    }
            
    }
    return (count);
}
status main()
{
    int i,j,num,k;
    int c[m],d[m];
    char str[MAX],b[m][n];
    LNode *h[m];
    HString strg[p],s[m];
    cout<<"请输入要比较的保留字:"<<endl;
    for(i=0;i<m;i++)
    {
        gets(b[i]);
        h[i]=SetNULL();
        c[i]=0;
        d[i]=0;
        StrAssign(s[i],b[i]);
    }
    j=0;
    cout<<"请输入源程序:"<<endl;
    for(k=0;k<p;k++)
    {
        gets(str);
                StrAssign(strg[k],str);
                 j++;
        for(i=0;i<m;i++)
        {
            num=Index(strg[k],s[i]);
            if(num)
            {
                ListInsert(h[i],j);
                c[i]=c[i]+num;
                d[i]=d[i]+1;
            }
            clearString(strg[k]);
        }
    }
    for(i=0;i<m;i++)
    {
                  cout<<"保留字""<<endl;
        puts(b[i]);
        cout<<"在文章中出现了"<<c[i]<<"次"<<endl;
        cout<<"出现在的行号数为:";
        for(j=0;j<d[i];j++)
            cout<<ListDelete(h[i]);
        cout<<endl;
    }
    return OK;
}
      为什么越改越错,请各位高手帮我看一下,不胜感激。
    在此谢过了。谢谢。



 



[fly]急救[/fly][em10]