数据结构-文章编辑

//文章编辑
//时间: 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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值