文章编辑(数据结构)代码

#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("
");
	do
	{
		printf("%s
", p->data);
	} 
	while((p=p->next)!=NULL);   //遍历链表
	printf("
"); 
}
void menu()
{
	printf("====================文章编辑=============================
");
	printf("===       1.输出文章                                  ===
");
	printf("===       2.统计输出统计字数                          ===
");
	printf("===       3.统计某一字符串在文章中出现的次数          ===
");
	printf("===       4.删除文章中某一字符串及删除后的文章        ===
");
	printf("===       5.增加内容                                  ===
");
	printf("===       6.整行删除                                  ===
");
	printf("=========================================================");
	printf("


");
}
void Create(LinkNode * &L) //字符创的创建函数 
{
	printf("请输入一页文章,以Ctrl+E为结尾(每行最多输入80个字符):
");
	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]='';
			break;
		}
	}
	p->next=NULL;    //最后一个指针为空
	L=L->next;
	OutPut(L);
	printf("
");
	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
", 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("
");
}
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
", count);
	printf("
"); 
}
void CountAll(LinkNode * &L)
{
	LinkNode *p=L;
	int count=0;
	do
	{
		count+=strlen(p->data);
	}
	while((p=p->next)!=NULL);
    printf("文章总字数:%d
", count);
	printf("
");
}
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
", count);
	printf("
");
}
//删除指定的字符串
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]='';
	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("删除指定字符串后的文章为:
");
	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("
");
}
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("输入有误。
");
}
int main()
{
	LinkNode *L;
	int i;
	Create(L);
	while(1)
	{
		printf("请输入相应指令:
");
		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("您输入的数字有误
"); 
		}
		menu();
		
	} 
}


原文地址:https://www.cnblogs.com/szy5201314/p/14175387.html