文章編輯(資料結構)程式碼
阿新 • • 發佈:2020-12-22
#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(); } }