数据结构-文章编辑

来源:互联网 发布:js倒计时3秒 编辑:程序博客网 时间:2024/04/30 00:43

//文章编辑
//时间: 2005-7-6
//程序:张建波

#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include "Menu.h"
#include "key.h"
#include <stdlib.h>


typedef struct line{
    //char data[80];
    char *data;      //字符串指针需要时 动态分配内存
    struct line *next;
}LINE;

void CreateTXT(LINE * &head); //创建一张列表,同时向里面输入 文本数据
int Count_Space(LINE * &head); //统计空格数
int Count_ZM(LINE * &head);  //  统计字母数
int Count_All_Word(LINE * &head); //统计文章的总字数
int Find_Word(LINE * &head,char *sch); //统计 sch 在文章中出现的次数
int Count_Num(LINE * &head); //统计数字 数
void Del_String(LINE * &head,char *sch); //删除指定的字符串
void OutPutTxt(LINE * &head); //向屏幕输出 文章
void Tj(LINE * &head); //统计

int _f5_main(){

    LINE *head;         //文章的首结点

    Menu m[10];
    m[1].Name="新建文本链表 ";
   
    m[2].Name="浏览输入文本 ";
   
    m[3].Name="文本统计  ";
   
    m[4].Name="字符串统计";

    m[5].Name="字符串删除 ";
   
    m[6].Name="返回       ";
   


    int t=1,ID;
    while(t)
    {
        ShowMenu("数据结构----文章编辑",m,6);//显示菜单

        ID=SelectMenuID();
        switch(ID)
        {
        case 1:CreateTXT(head);break;

        case 2:{
    //        system("cls");   //清屏,调用系统shell命令

            OutPutTxt(head);     //向屏幕输出 文章
           
            InitKey();
               break;
               }
   
        case 3:{
         //   system("cls");   //清屏,调用系统shell命令

            Tj(head);
            InitKey();  //键盘中断

            break;
               }
        case 4:{
        //       system("cls");   //清屏,调用系统shell命令
               cout<<"/n请输入要统计的 字符串/n";
               char sch[20];
               cin>>sch;
               cout<<"/n"<<sch<<"出现的次数为:"<<Find_Word(head,sch);
               InitKey();
               break;
               }
        case 5:{
            cout<<"/n请输入要删除的某一字符串:"<<endl;
            char tmp_sch[20];
            cin>>tmp_sch;
            Del_String(head,tmp_sch);  //删除指定字符
            OutPutTxt(head);     //向屏幕输出 文章
            InitKey();
            break;
               }
        case 6:return 0;
        }
   
    }
        return 0;
}

void CreateTXT(LINE * &head){
    printf("/n请输入文本,每行最多输入80字符!/n");
    printf("输入 Ctrl + E (^E) 则结束输入/n");
    LINE *p=new LINE;  //首先为链表 建立一个附加表头结点
    head=p; //将p付给 表头指针
    char tmp[80];
    while(1)
    {
       gets(tmp);  //输入字符串!使用C的输入函数
      // printf("%d",strlen(tmp));     
       if(tmp[0]==5)break;  //如果发现输入 ^E,则退出输入     
       p=p->next=new LINE;
       p->data=new char[strlen(tmp)+1];//为结点分配空间     
       strcpy(p->data,tmp);
          if(tmp[strlen(tmp)-1]==5){    //除去最后一个控制符 ^E       
           p->data[strlen(tmp)-1]='/0';
           break;
       }
    }

    p->next=NULL;  //是最后的一个指针为空。
    head=head->next;
   
}

int Count_Space(LINE * &head){ //统计空格数
    LINE *p=head;
    int asc_space=32; //空格的ASCIC 码值
    int count=0;
   
    do
    {       
        int Len=strlen(p->data);           //计算当前 data 里的数据元素的个数
        for(int i=0;i<Len;i++)
        if(p->data[i]==asc_space)count++;  //计算空格数
    }   
    while((p=p->next)!=NULL);    //遍历 链表

    return count;
}

int Count_Num(LINE * &head){ //统计数字 数
    LINE *p=head;
    int count=0;
   
    do
    {       
        int Len=strlen(p->data);           //计算当前 data 里的数据元素的个数
        for(int i=0;i<Len;i++)
        if(p->data[i]>=48 && p->data[i]<=57)count++;  //计算空格数
    }   
    while((p=p->next)!=NULL);    //遍历 链表

    return count;
}

int Count_ZM(LINE * &head){  //  统计字母数
    int count=Count_All_Word(head); //总的字符数,包含空格
    int space_count=Count_Space(head); //空格数
    return count-space_count;  //返回文章的字母总数

}


int Count_All_Word(LINE * &head){ //统计文章的总字数
    LINE *p=head;  //保存链表的首地址
    int count=0;   //总字母数
    do
    {count+=strlen(p->data);}    //计算当前行内的字符数!除'/0'结束符外!注意,该统计包含“空格的长度!”
    while((p=p->next)!=NULL);    //遍历 链表
   
    return count;
}


int Find_Word(LINE * &head,char *sch){ //统计 sch 在文章中出现的次数

    LINE *p=head;
    int count=0;
    int h=0;

    int len1=0; //保存当前行的总字符数
    int len2=strlen(sch); //待统计字符串的长度

    int i,j,k;
    do
    {

    len1=strlen(p->data);//当前行的字符数

    for(i=0;i<len1;i++)
    {   
        if(p->data[i]==sch[0])
            {
                k=0;
                for(j=0;j<=len2-1;j++)
                    if(p->data[i+j]==sch[j])k=k+1;
            if(k==len2){count++;i=i+k-1;}
            }
    }
    }   
    while((p=p->next)!=NULL);    //遍历 链表
    return count;
}

void del_string_word(char *s,char *sch)
{
    // *s为输入的字符串
    // *sch 为将要删除的字符

    char *p=strstr(s,sch);    //查询结果
    char tmp[80];
    int len=strlen(s);
    int i=len-strlen(p);
    int j=i+strlen(sch);
    int count=0;
    for(int k=0;k<i;k++)tmp[count++]=s[k];
    for(int kk=j;kk<len;kk++)tmp[count++]=s[kk];
    tmp[count]='/0';

    strcpy(s,tmp); //返回新的字符串
}

void Del_String(LINE * &head,char *sch){ //删除指定的字符串
    LINE *p=head;
    do
    {
        if(strstr(p->data,sch)!=NULL)del_string_word(p->data,sch);
    }    while((p=p->next)!=NULL);    //遍历 链表
}


void OutPutTxt(LINE * &head){ //向屏幕输出 文章
    LINE *p=head;
   
    do
    {    cout<<p->data<<endl;
    }    while((p=p->next)!=NULL);    //遍历 链表
}


void Tj(LINE * &head){ //统计

        cout<<"文章统计信息结果如下:/n";
        cout<<"/n英文字母数:"<<Count_ZM(head);
        cout<<"/n空格数: "<<Count_Space(head);
        cout<<"/n文章中共出现数字:"<<Count_Num(head);
        cout<<"/n统计文章的总字数: "<<Count_All_Word(head);
   
}