用户名:MYWORJD
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<st问答dlib.h>
#includ简困e<ctype.h>
#define**LL0
#defineMAX表磁交许最100
typedefstructlnode{
chardate[MAX];//存放**
structlnode双非黑经留三基挥间左跟*prior;//前驱
structlnode*next;//后继
int**mber;//记反几录一个节点的字符数!鱼发主件深概衣独露如果是头节点就记录他的节点个数
intquese;//记录节点在链表中的位置
}lnodetype;
lnodetype*l;//设置两个全局变量,分别是头节点指划七针和尾节点指针
lnodetype*end;
//**********这个函数是用来初始化的**普图营级升好短称今血********//
intiniatelist提基久威十般交议施首(lnodetype**l,lnodetype**end)
{
(*l)=(lnodetype低乱损皮*)malloc(酒责灯否sizeof(lnodetype));
if((*l)==**LL)
{
printf("没有只够的内存空间!程序即将退出!");
return0;
}
(*l)->prior=(*l)->next=**LL;//这是双链表
(*l)->**mber=(*l)->quese=0;
(*end)=(*l);
p派且达rintf("程序初始化完毕!")阿若求初管继告校院门头;
return0;
}
//**********这个函数是用来建立节点,并且插入元素的**********//
intlink(lnodetype**l,lnodetype**end)
{
lnodetype甚左三并介父印*s;
s=(lnodetype*)malloc(sizeof(lnodetype));
i晶千息心轮面多沉f(s==**LL){
printf("内存空间不够,程判序即将退出!");
return0;
}
(*end李封载积)->next=s;
s->prior=(*end);
本操画洋(*end)=(*end)->next;
(*帮么临盐云宜袁l)->**mber++;//增加一个节点,头节点的**mber就加1
s->quese=(*l)->**mber;//这个是记录节点在链表中的位置
printf("%d行",s->quese);//这个是节点在整个链表中的位置
gets(s->date);
s->**mber=strlen(s->date);
return0;
}
//**********这个是打印链表的函数**********//
intprin(lnodetype**l,lnodetype**end)
{
lnodetype*p;
inti;
intj=0;
intcouter=(*l)->**mber;
p=(*l)->next;
for(i=0;i<couter;i++){
printf("%d行",i+1);
j=0;
while((p->date[j]>='a'&&p->date[j]<='z')||
(p->date[j]>='A'&&p->date[j]<='z')||
p->date[j]>='0'&&p->date[j]<='9')
{
printf("%c",p->date[j]);
j++;
}
printf("n");
p=p->next;
}
return0;
}
//*********这个查找和编辑相应行的函数**********//
intsearch(lnodetype**l,lnodetype**end)
{
int**mber;
scanf("%d",&**mber);
inti;
lnodetype*p;
p=(*l)->next;
for(i=0;i<**mber-1;i++)
p=p->next;
printf("%d行",**mber);
gets(p->date);
return0;
}
//**********这个是在文本文件里搜索字符串的函数**********//
intsearchstr(lnodetype**l,lnodetype**end)
{
charptr[100];
intarrycouter;
intmystrcmp(char*,char*,int);
printf("ok!现在输入你查找的字符串!");
scanf("%s",ptr);
arrycouter=strlen(ptr);
lnodetype*s;
s=(*l)->next;
char*p;
inti=1;
intcouter=0;
int**mber=(*l)->**mber;
p=(char*)s->date;
while(i&&**mber){
//i=1是,明没有找到,向第二个节点继续寻找
while(i&&(((*p>='a')&&(*p<='z'))||((*p>='A')&&(*p<='Z')))){
i=mystrcmp(p,ptr,arrycouter);
if(i==1){
printf("字符串已经在第%d行,第%d个字符开始,",s->quese,couter+1);
i=0;
}
else
{
p++;
couter++;
i=1;
}
}
s=s->next;
p=(char*)s->date;
**mber--;
}
if(i==1)
printf("字符串在本文档中不存在!");
return0;
}
//**********(1)这个函数是用来实现退出不保存功能的**********//
intexituns**e(lnodetype**l,lnodetype**end)
{
lnodetype*s;
while((*l)!=(*end)){//如果不保存的话,最好是把节点的空间都释放,节省空间
s=(*end);
(*end)=(*end)->prior;
free(s);
}
return0;
}
//**********(2)这个函数是用来实现退出但保存功能的**********//
intquitands**e(lnodetype**l,lnodetype**end)
{
FILE*fp;
charch;
charfilename[20];
lnodetype*p;
inti;
intj;
intcouter=(*l)->**mber;
p=(*l)->next;
printf("请输入文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==**LL){
printf("文件不能打开!n");
return0;
}
for(i=0;i<couter;i++){//有几个节点就进行多少次的存贮
ch=p->date[0];
j=1;
while(ch!='\0'){
fputc(ch,fp);
ch=p->date[j];
j++;
}
p=p->next;
fputc('#',fp);//注意在每个节点的后面加上结束的符号
}
fputc('@',fp);//整个文件关闭的标志
fclose(fp);//注意关闭文件,
return0;
}
//**********由于库函数比较字符串提供的功能不满足要求,故自己写了一个**********/
intmystrcmp(char*p,char*sour,int**mber)
{
while(**mber&&(*p)==(*sour)&&
(((*p>='a')&&(*p<='z'))||((*p>='A')&&(*p<='Z')))){
p++;
sour++;
**mber--;
}
if(**mber==0)
return1;
else
return0;
}
//**********这个函数是用来实现统计字符串功能的**********//
intcoutword(lnodetype**l,lnodetype**end)
{//考虑到只统计一行的单词没有意义,故统计整个文本
intyes=1;//这个是进入单词的标志
intno=0;//在单词外面的时候的标志
inti,j,inaword,count=0;
inaword=no;
lnodetype*s=(*l)->next;
for(j=0;j<(*l)->**mber;j++){
for(i=0;(s->date[i]>='a'&&s->date[i]<='z')||
(s->date[i]>='A'&&s->date[i]<='z')||
(s->date[i]>='0'&&s->date[i]<='9')||
(s->date[i]=='');i++)
{
if(s->date[i]=='')
inaword=no;
else
if(inaword==no)
{
inaword=yes;
count++;//计算单词
}
}
s=s->next;
inaword=0;//注意这里,把标志置为0了!
}
printf("n文本一**有%d行",(*l)->**mber);
printf("n此文本一**有%d个单词!",count);
returncount;
}
//**********这个函数是用来实现计算文本行数功能的**********//
intlinecouter(lnodetype**l,lnodetype**end)
{
intcouter;
couter=(*l)->**mber;
returncouter;
}
//**********这个函数是整和一上所有功能的菜单函数**********//
inteditme**(lnodetype**l,lnodetype**end)
{
charchoice;
char*p="cls";
inti=1;//这两个变量是用来控制循环的
intj=1;
system(p);
prin(&(*l),&(*end));
while(j){
printf("***********************************e:编辑相应行*************************************n");
printf("***********************************s:搜索字符串*************************************n");
printf("***********************************t:统计单词个数***********************************n");
printf("***********************************q:退出编辑***************************************n");
scanf("%c",&choice);
scanf("%c",&choice);//????莫名其妙的问题,非要两个请求输入语句才肯停下来!
switch(choice)
{
case'e':{
i=1;
while(i)
{
search(&(*l),&(*end));
system(p);
prin(&(*l),&(*end));
printf("n1继续编辑0结束编辑n");
scanf("%d",&i);
}
}
bre**;
case's':{
i=1;
while(i)
{
searchstr(&(*l),&(*end));
getchar();
getchar();
system(p);
prin(&(*l),&(*end));
printf("n1继续搜索0结束搜索n");
scanf("%d",&i);
}
}
bre**;
case't':{
coutword(&(*l),&(*end));
getchar();
}bre**;
default:return0;
}
system(p);
prin(&(*l),&(*end));
printf("n1回到编辑菜单0结束编辑n");
scanf("%d",&j);
if(j==1)
system(p);
else
return0;
}
return0;
}
//**********实现第一个模块:新建空白文档**********//
intnewtext(lnodetype**l,lnodetype**end)
{
printf("新文本文件:n");
inti=1;
charjudstr[MAX];
lnodetype*temp;
charjud;
char*p="cls";
while(1){
link(&(*l),&(*end));
jud=(*end)->date[0];
if(jud=='5'){//输入‘5’结束一切
temp=(*end);
(*end)=(*end)->prior;
free(temp);
while(1){
printf("*******************************out:退出不保存****************************n");
printf("*******************************edit:编辑信息*****************************n");
printf("*******************************quit:退出而不存盘**************************n");
printf("*******************************qas:退出且存盘****************************n");
printf("*******************************con:继续输入!*****************************n");
gets(judstr);
if(!strcmp(judstr,"out"))
{
exituns**e(&(*l),&(*end));
return0;
}
else
if(!strcmp(judstr,"qas"))
{
quitands**e(&(*l),&(*end));
return0;
}
else
if(!strcmp(judstr,"edit"))
{
editme**(l,end);
return0;
}
system(p);
}
return0;
}
}
return0;
}
//**********这个是装入文件的函数**********//
intloadtaxt(char*filename)
{
FILE*fp;
lnodetype*l;
charch;
inti=0;
char*p="cls";
charjudstr[MAX];
lnodetype*head;
lnodetype*end;
iniatelist(&head,&end);
l=end=head;
if((fp=fopen(filename,"r+"))==**LL){
printf("文件不能打开!n");
return0;
}
ch=fgetc(fp);
while(ch!='@'){
lnodetype*s;
s=(lnodetype*)malloc(sizeof(lnodetype));
if(s==**LL){
printf("内存空间不够,程序即将退出!");
return0;
}
end->next=s;
s->prior=end;
end=end->next;
l->**mber++;
s->quese=l->**mber;
printf("%d行",s->quese);
while(ch!='#'){
s->date[i]=ch;
ch=fgetc(fp);
i++;
}
i=0;
while((end->date[i]>='a'&&end->date[i]<='z')||
(end->date[i]>='A'&&end->date[i]<='z')||
(end->date[i]>='0'&&end->date[i]<='9')||
(end->date[i]==''))
{
printf("%c",end->date[i]);
i++;
}
end->date[i]='\0';//注意在节点的最好加上这个,以让退出保存功能函数知道此节点已结束
printf("n");
i=0;
ch=fgetc(fp);
}
fclose(fp);
printf("n文件成功装入!n");
while(1){
printf("*******************************out:退出不保存****************************n");
printf("*******************************edit:编辑信息*****************************n");
printf("*******************************qas:退出且存盘****************************n");
printf("*******************************con:继续输入!*****************************n");
scanf("%s",judstr);
if(!strcmp(judstr,"out"))
{
exituns**e(&l,&end);
return0;
}
else
if(!strcmp(judstr,"qas"))
{
quitands**e(&l,&end);
return0;
}
else
if(!strcmp(judstr,"edit"))
{
editme**(&l,&end);
return0;
}
system(p);
}
return0;
}
//**********主函数**********//
voidmain(void)
{
//iniatelist(&l,&end);
//newtext(&l,&end);
charfilename[MAX];
scanf("%s",filename);
loadtaxt(filename);
}
很不容易做的程序!!!
通过编译