📄 文章编辑源程序.cpp
字号:
#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"
#define MAXSIZE 80
typedef struct LineNode
{char *data;//字符串指针需要时 动态分配内存
struct LineNode *next;
}LineNode,*Line;
void CreatTxt(Line &head) //创建链表,同时向里面输入文本数据
{Line p;
char a[MAXSIZE];
int flag=1;
p=(Line)malloc(sizeof(LineNode));
head=p;
printf("\n请输入文档,每行最多输入80个字符(输入字符#结束):\n");
while(flag)
{ p=p->next=(Line)malloc(sizeof(LineNode));
gets(a);
p->data=(char *)malloc((strlen(a)+1)*sizeof(char));
strcpy(p->data,a);
if(p->data[strlen(a)-1]=='#')
{ //除去最后一个控制符 #
p->data[strlen(a)-1]='\0';
flag=0;
}
}
p->next=NULL; //使最后的一个指针为空。
}
int Count_Space(Line head)
{ //统计空格数
Line p=head->next;
int count=0;
while(p)
{ int Len=strlen(p->data); //计算当前 data 里的数据元素的个数
for(int i=0;i<Len;i++)
if(p->data[i]==' ')count++; //计算空格数
p=p->next; //指针下移
}
return count;
}
int Count_Num(Line head)
{ //统计数字 数
Line p=head->next;
int count=0;
while(p)
{ int Len=strlen(p->data); //计算当前 data 里的数据元素的个数
for(int i=0;i<Len;i++)
if(p->data[i]>=48 && p->data[i]<=57)count++; //计算数字数
p=p->next; //指针下移
}
return count;
}
int Count_All_Word(Line head)
{ //统计文章的总字数
Line p=head->next; //保存链表的首地址
int count=0; //总字母数
while(p)
{count+=strlen(p->data); //计算当前行内的字符数
p=p->next; //指针下移
}
return count;
}
int Count_ZM(Line &head)
{ // 统计字母数
int count=Count_All_Word(head); //总的字符数,包含空格
int space_count=Count_Space(head); //空格数
int num_count=Count_Num(head);//数字数
return count-space_count-num_count; //返回文章的字母总数
}
int Find_Word(Line head,char *sch)
{ //统计 sch 在文章中出现的次数
Line p=head->next;
int count=0;
int h=0;
int i,j,k;
int len1=0; //保存当前行的总字符数
int len2=strlen(sch); //待统计字符串的长度
while(p)
{ 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++;
if(k==len2) {count++;i=i+k-1;}
}
}
p=p->next; //指针下移
}
return count;
}
void del_string(char *s,char *sch)
{
// *s为输入的字符串
// *sch 为将要删除的字符
int k,m;
char *p=strstr(s,sch); //在串s中查找串sch的第一次出现
char tmp[MAXSIZE];
int len=strlen(s);
int i=len-strlen(p);
int j=i+strlen(sch);
int count=0;
for(k=0;k<i;k++)tmp[count++]=s[k];
for(m=j;m<len;m++)tmp[count++]=s[m];
tmp[count]='\0';
strcpy(s,tmp); //返回新的字符串
}
void Del_String(Line &head,char *sch)
{ //删除指定的字符串
Line p=head->next;
while(p)
{
if(strstr(p->data,sch)!=NULL)del_string(p->data,sch);
p=p->next; //遍历 链表
}
}
void OutPutTxt(Line &head)
{ //向屏幕输出文本
Line p=head->next;
while(p)
{puts(p->data);
p=p->next;
}
}
void TxtTJ(Line head)
{ //统计
printf("\n文章统计信息结果如下:\n");
printf("\n文章中的字母数:%d\n",Count_ZM(head));
printf("\n文章中的空格数:%d\n",Count_Space(head));
printf("\n文章中的数字数:%d\n",Count_Num(head));
printf("\n文章中的总字数:%d\n",Count_All_Word(head));
}
int menu() //菜单函数
{int d;
printf("\n::::::::数据结构----文本编辑::::::::\n");
printf("\n:::::1--输入文本 2--显示文本::::::\n");
printf("\n:::::3--文本统计 4--统计子串::::::\n");
printf("\n:::::5--删除子串 按其他键退出:::::\n");
printf("\n::::::::::::::::::::::::::::::::::::\n");
scanf("%d",&d);
return(d);
}
int main()
{Line head;
int
j=1;
char b[MAXSIZE];
while(j)
{
switch(menu())
{case 1:CreatTxt(head);break;
case 2:printf("\n输出文本:\n");
OutPutTxt(head);break;
case 3:TxtTJ(head);break;
case 4:{printf("请输入要统计的子串:");
getchar();
gets(b);
printf("该子串在文本中出现的次数为%d",Find_Word(head,b));
break; }
case 5:{printf("\n请输入要删除的子串:");
getchar();
gets(b);
Del_String(head,b);
printf("\n输出删除该子串后的文本:\n");
OutPutTxt(head);
break;}
default:j=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -