#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_LEN 80 //最后一个用来装结束符'\0'
#define N 20 //最大定义20行
typedef struct _node{
char data[MAX_LEN];
struct _node *next;
}node;
typedef node * list;
#define CHECK(L,data) \
{\
if(L==NULL || (strlen(data)>MAX_LEN-1))\
return;\
}
void delete_string(char src[MAX_LEN], char * data);
list list_init()
{
int i;
list head, p;
head = (list)malloc(sizeof(node));
assert(head);
memset(head->data, 0, sizeof(head->data));
head->next = NULL;
for(i=1;i<=N;i++)
{
p = (list)malloc(sizeof(node));
assert(p);
memset(p->data, 0, sizeof(p->data));
p->next = head->next;
head->next = p;
}
return head;
}
int list_get_len(list L)
{
int len = 0;
assert(L);
list p = L->next;
while(p->data[0]!=0)
{
p = p->next;
len++;
}
return len;
}
void list_add(list L, char data[])
{
CHECK(L, data);
int len = list_get_len(L);
list new, cur = L;
while(len>0 && cur != NULL)
{
cur = cur->next;
len--;
}
new = cur->next;
if(new->data[0]!=0)
return;
else
strcpy(new->data, data);
return;
}
void list_delete_string(list L, char data[])
{
CHECK(L, data);
list p = L->next;
int len = strlen(data);
while(p->data[0]!=0)
{
delete_string(p->data, data);
p=p->next;
}
}
int list_get_string_count(list L, char data[])
{
CHECK(L, data);
list p = L->next;
int count = 0;
while((p->data[0]!=0))
{
count += get_string_count(p->data, data);
p=p->next;
}
return count;
}
int get_string_count(char * src, char * data)
{
assert(src && data);
int count = 0;
char *p = src;
int len = strlen(data);
while((p = strstr(p, data))!=NULL)
{
count++;
p = p+len;
}
return count;
}
void delete_string(char src[MAX_LEN], char * data)
{
assert(src && data);
int i,j=0;
char *p = src;
char *q = src;
int len = strlen(data);
int len_p = strlen(p);
char buf[MAX_LEN];
memset(buf,0,sizeof(buf));
while((p = strstr(p, data))!=NULL)
{
while(q!=p)
{
buf[j++] =*q++;
}
p = p+len;
q=p;
}
while(q<=(src+strlen(src)-1))
buf[j++] = *q++;
memset(src, 0, sizeof(src));
strcpy(src, buf);
}
void list_statistics_word(list L)
{
assert(L);
int c_letter,c_digital,c_space,c_total,i;
c_letter=c_digital=c_space=c_total=0;
list p = L->next;
while((p->data[0]!=0))
{
for(i=0;i<strlen(p->data);i++)
{
if((p->data[i] <='Z' && p->data[i]>='A')||
(p->data[i] <='z' && p->data[i]>='a'))
c_letter++;
if(p->data[i]>='0' && p->data[i]<='9')
c_digital++;
if(p->data[i] == ' ')
c_space++;
c_total++;
}
p=p->next;
}
printf("统计:\r\n");
printf(" 字母个数: %3d\r\n",c_letter);
printf(" 数字个数: %3d\r\n",c_digital);
printf(" 空格个数: %3d\r\n",c_space);
printf(" 全部个数: %3d\r\n",c_total);
}
void list_display(list L)
{
assert(L);
list p = L->next;
printf("文本内容为:\r\n");
while(p->data[0]!=0)
{
printf("%s\r\n",p->data);
p = p->next;
}
}
void list_destroy(list L)
{
assert(L);
list p,q;
p = L;
q = L->next;
while(q!=NULL)
{
free(p);
p=q;
q=q->next;
}
free(p);
}
void get_option()
{ printf("*****************************************\r\n");
printf(" 主菜单 \r\n");
printf("*****************************************\r\n");
printf(" 1 : 输入文本\r\n");
printf(" 2 : 显示文本内容\r\n");
printf(" 3 : 统计出现的字符\r\n");
printf(" 4 : 统计各个字符串出现的次数\r\n");
printf(" 5 : 删除指定的字符串\r\n");
printf(" 0 : 退出程序\r\n");
printf("*****************************************\r\n");
}
int input(char s[MAX_LEN])
{
int i = 0;
memset(s, 0, sizeof(s));
char ch;
while((ch=getchar())!='\n')
{
if(i>=MAX_LEN)return -1;
s[i++] = ch;
}
return 0;
}
int main()
{
int op;
char s[MAX_LEN];
int count;
list L = list_init();
assert(L);
while(1)
{
get_option();
input(s);
op = atoi(s);
switch(op)
{
case 0:
exit(1);
break;
case 1:
printf("请输入文本内容:\r\n");
if(input(s)!=0)
printf("错误 :输出长度超出最大范围!!\r\n");
else
list_add(L, s);
break;
case 2:
list_display(L);
break;
case 3:
list_statistics_word(L);
break;
case 4:
printf("请输入要统计的字符串\r\n");
if(input(s)!=0)
printf("错误 :输出长度超出最大范围!!\r\n");
else{
count = list_get_string_count(L, s);
printf("%s 在文本中出现 %d 次.\r\n",s,count);
}
break;
case 5:
printf("请输入要删除的字符串\r\n");
if(input(s)!=0)
printf("错误 :输出长度超出最大范围!!\r\n");
else
list_delete_string(L, s);
break;
default:
printf("输入不合法!\r\n");
break;
};
}
list_destroy(L);
return 1;
}