#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct LNode
{
char *data;//字符串
struct LNode *next;
}LinkNode;
void OutPut(LinkNode *L)
{
LinkNode *p=L; //将头指针赋值给P
printf("\n");
do
{
printf("%s\n", p->data);
}
while((p=p->next)!=NULL); //遍历链表
printf("\n");
}
void menu()
{
printf("====================文章编辑=============================\n");
printf("=== 1.输出文章 ===\n");
printf("=== 2.统计输出统计字数 ===\n");
printf("=== 3.统计某一字符串在文章中出现的次数 ===\n");
printf("=== 4.删除文章中某一字符串及删除后的文章 ===\n");
printf("=== 5.增加内容 ===\n");
printf("=== 6.整行删除 ===\n");
printf("=========================================================");
printf("\n\n\n");
}
void Create(LinkNode * &L) //字符创的创建函数
{
printf("请输入一页文章,以Ctrl+E为结尾(每行最多输入80个字符):\n");
LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode)); //首先为链表建立一个附加表头结点
L=p; //将p赋值给表头指针
char tmp[100]; //输入的字符串
while(1)
{
gets(tmp); //输入字符串
if(strlen(tmp)>80) //strlen求字符串的长度
{
printf("每行最多输入80个字符!");
break;
}
if(tmp[0]==5)
break; //如果发现输入E,则退出输入
p=p->next=(LinkNode *)malloc(sizeof(LinkNode));
p->data=(char *)malloc(sizeof(char));//为结点分配空间
strcpy(p->data, tmp); //把tmp复制给p->data strcpy()函数用来复制字符串
if(tmp[strlen(tmp)-1]==5) //除去最后一个控制符E
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL; //最后一个指针为空
L=L->next;
OutPut(L);
printf("\n");
menu();
}
//统计英文字母数
void CountLetter(LinkNode * &L) //计算英文字母字数
{
LinkNode *p=L;
int count=0;
do
{
int Len=strlen(p->data); //计算当前data里的数据元素个数
for(int i=0; i<Len; i++)
{
if((p->data[i]>='a' && p->data[i]<='z')||(p->data[i]>='A' && p->data[i]<='Z')) //计算英文字母数
count++;
}
}
while((p=p->next)!=NULL);
printf("文章中全部英文字母个数:%d\n", count);
}
void CountSpace(LinkNode * &L)
{
LinkNode *p=L;
int count=0;
do
{
int Len=strlen(p->data);
for(int i=0; i<Len; i++)
if(p->data[i]==' ')
count++;
}
while((p=p->next)!=NULL);
printf("文章中空格个数:%d", count);
printf("\n");
}
void CountNumber(LinkNode * &L) //计算数字字数
{
LinkNode *p=L;
int count=0;
do
{
int Len=strlen(p->data);
for(int i=0; i<Len; i++)
{
if(p->data[i]>='0' && p->data[i]<='9')
count++;
}
}
while((p=p->next)!=NULL);
printf("文章中数字个数:%d\n", count);
printf("\n");
}
void CountAll(LinkNode * &L)
{
LinkNode *p=L;
int count=0;
do
{
count+=strlen(p->data);
}
while((p=p->next)!=NULL);
printf("文章总字数:%d\n", count);
printf("\n");
}
void FindString(LinkNode * &L)
{
LinkNode *p=L;
int count=0, len1=0, len2, i, j, k;
char str1[20];
printf("请输入需要统计的字符串:");
scanf("%s", str1); //
len2=strlen(str1);
do
{
len1=strlen(p->data);
for(i=0; i<len1; i++)
{
if(p->data[i]==str1[0])
{
k=0;
for(j=0; j<len2; j++)
{
if(p->data[i+j]==str1[j])
k++;
if(k==len2)
{
count++;
i=i+k-1;
}
}
}
}
}
while((p=p->next)!=NULL); //遍历链表
printf("该字符串在文中出现的次数:%d\n", count);
printf("\n");
}
//删除指定的字符串
int delstringword(char *s, char *str) //*s为输入的字符串,*str为将要删除的字符串
{
//从字符串中寻找str第一次出现的位置
char *p=strstr(s,str);
char tmp[80];
int len=strlen(s);
int i=len-strlen(p);
int j=i+strlen(str);
int count=0;
for(int m=0; m<i; m++)
tmp[count++]=s[m];
for(int n=j; n<len; n++)
tmp[count++]=s[n];
tmp[count]='\0';
strcpy(s,tmp);
return count;
}
void DelString(LinkNode * &L)
{
int count=0;
LinkNode *p=L;
char str[20];
printf("请输入需要删除的某一字符串:");
scanf("%s", str);
do
{
while(strstr(p->data, str)!=NULL){
delstringword(p->data,str);
}
}
while((p=p->next)!=NULL);
printf("删除指定字符串后的文章为:\n");
OutPut(L);
}
void AddContent(LinkNode * &L){
LinkNode *p=L;
while(p->next!=NULL){
p=p->next;
};
char tmp[100]; //输入的字符串
printf("请输入一行内容(不超过80个字符长度):");
getchar(); //输入字符串
gets(tmp);
if(strlen(tmp)>80) //strlen求字符串的长度
{
printf("每行最多输入80个字符!");
return;
}
p=p->next=(LinkNode *)malloc(sizeof(LinkNode));
p->data=(char *)malloc(sizeof(char));//为结点分配空间
p->next=NULL; //最后一个指针为空
strcpy(p->data, tmp); //把tmp复制给p->data strcpy()函数用来复制字符串
OutPut(L);
printf("\n");
}
void DelLine(LinkNode * &L){
LinkNode *p=L,*temp;
int l,count=1;
printf("请输入你想删除的行数:");
scanf("%d",&l);
while(p->next!=NULL){
if(l==count){
p->data=p->next->data;
p->next=p->next->next;
return;
}
temp=p;
p=p->next;
count++;
};
if(l==count){
temp->next=NULL;
}
else
printf("输入有误。\n");
}
int main()
{
LinkNode *L;
int i;
Create(L);
while(1)
{
printf("请输入相应指令:\n");
scanf("%d", &i);
system("cls");
switch(i)
{
case 1:OutPut(L);break;
case 2:CountSpace(L);CountLetter(L);CountNumber(L);CountAll(L); break;
case 3:FindString(L); break;
case 4:DelString(L); break;
case 5:AddContent(L);break;
case 6:DelLine(L);break;
default:printf("您输入的数字有误\n");
}
menu();
}
}