1. 程式人生 > 實用技巧 >文章編輯(資料結構)程式碼

文章編輯(資料結構)程式碼

#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();
		
	} 
}