数据结构文本编辑.docx
《数据结构文本编辑.docx》由会员分享,可在线阅读,更多相关《数据结构文本编辑.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构文本编辑
深圳大学实验报告
课程名称:
数据结构与算法
实验名称:
文本处理
学院:
电子学院
专业:
光信息科学与技术
指导教师:
吴庆阳
报告人:
朱腾飞学号:
2009160166班级:
光信2班
实验时间:
2010-5-20
实验报告提交时间:
实验要求:
支持文本的插入、删除、修改;
支持字符串的查询、修改;
支持文本行的删除、替换;
支持大文本的处理;
支持文本的打印;
程序介绍:
本程序分为两部分:
1.字符串的处理,主要包括:
字符串中字符的替换、字符串中子串的查询、删除、插入、替换等。
2.
大文本编辑,此部分程序自带一大文本进行处理,对该部分的处理采用的是链表和二维数组结合以及相关的字符串处理知识,
所有的大文本采取链表形式存储,以行为单位,每一行为一节点,然后对大文本的处理,比如,行的删除,行的插入,这些都与链表中结点的删除插入相似。
此部分包含的功能主要有:
大文本的打印、文本行的删除,行的插入,两行交换等。
大文本插入,每行超过80字符时,要在字符串处理部分实现.
实验结论:
在上个作业中,对链表有了更深理解,在这一作业中又进一步熟练了二维数组的操作,尤其是在对二维数组行引用,二维数组的初始化方式等方面。
提高啦编程能力
#include
#include
#include
typedefstructnode
{
charch;
structnode*next;
}lstring;
structlist
{
intnum;
charwenben[80];
structlist*Next;
};
typedefstructlistNode;
typedefNode*llink;
charfei[7][80]={"americansbelievenoonetaandsstillif",
"ouarefallingbehindtimeisoneofthetwoelementsthatamericanssav",
"ecarefulllyssometingalmostrealwebudgetitsaveitcutitkillitaccorit",
"afirstforeignerfirstexpressiongoftheusislik",
"enunderpressurecitypeopletestllyseekingattentioninastoeor",
"todayiaccomplishmytasksuccessfullyandtheteacher",
"idontknowhowtodothejobsoiturnto"};
//求串长的函数
intlength(lstring*s)
{
inti=0;lstring*p=s->next;
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
//输出串的函数
dispstr(lstring*s)
{
lstring*p=s->next;
if(p==NULL)
printf("空串\n");
else
{
while(p!
=NULL)
{
printf("%c",p->ch);
p=p->next;
}
}
printf("\n");
}
//插入字串,在串s的第pos个字符之前插入串t
lstring*insert(lstring*s,intpos,lstring*t)
{
intk;
lstring*p,*q;
p=s;
k=1;
while(k=NULL)
{
p=p->next;
k++;
}
if(p==NULL)
printf("无效pos\n");
else
{
q=t;
while(q->next!
=NULL)
q=q->next;
q->next=p->next;
p->next=t;
}
returns;
}
//删除子串,从串s中删除第pos个字符起长度为len的子串
lstring*strdelete(lstring*s,intpos,intlen)
{
intj=1,k;lstring*p,*q,*r,*b;
p=s;q=p;k=1;
while(p!
=NULL&&k<=pos)
{
q=p;
p=p->next;k++;
}
if(p==NULL)
printf("pos无效\n");
else
{
k=1;
while(k=NULL)
{
p=p->next;
k++;
}
if(p==NULL)
printf("pos无效\n");
else
{
r=q->next;
while(j<=len)
{
b=r;
r=r->next;
free(b);
j++;
}
q->next=r;}}
returns;
}
//字符串的查询函数,查询串s中第pos个字符开始的,连续len个字符组成的字串
lstring*substr(lstring*s,intpos,intlen)
{
intk;
lstring*str,*p=s->next,*q,*r;
str=(lstring*)malloc(sizeof(lstring));
str->next=NULL;r=str;
if(pos<=0||pos>length(s)||len<0||pos+len-1>length(s))
returnstr;
for(k=0;kp=p->next;
for(k=1;k<=len;k++)
{
q=(lstring*)malloc(sizeof(lstring));
q->ch=p->ch;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
returnstr;
}
//字符的替换函数,将串s中的某个字符c全部替换为另一个字符s
lstring*trans(lstring*str,charc,chars)
{
lstring*p;
p=str->next;
while(p!
=NULL)
{
if(p->ch==c)
p->ch=s;
p=p->next;
}
returnstr;
}
//字符串初始化函数
lstring*chushi(lstring*s,charcstr[])
{
inti;lstring*r,*p;
s=(lstring*)malloc(sizeof(lstring));
s->next=NULL;
r=s;
for(i=0;cstr[i]!
='\0';i++)
{
p=(lstring*)malloc(sizeof(lstring));
p->ch=cstr[i];
p->next=NULL;
r->next=p;
r=p;
}
returns;
}
//释放内存函数
freelist(lstring*dsp)
{
lstring*ptr,*prl;
prl=dsp;
ptr=NULL;
prl=prl->next;
while(ptr!
=NULL)
{
ptr=prl;
prl=prl->next;
free(ptr);
}
}
function()
{
printf("功能选择\n");
printf("1.字符串中字串的删除\n");
printf("2.字符串中字串的查询\n");
printf("5.释放内存,退出程序运行\n");
printf("3.字符串的插入\n");
printf("4.字符的替换\n");
printf("6.求目前串的长度\n");
printf("7.打印出大文本\n");
printf("8.大文本正行的删除\n");
printf("9.大文本整行的插入\n");
printf("10.整行查找\n");
printf("11.两行的互换\n");
}
//打印出大文本函数
dayin(llinkpm)
{
//intj;
llinkopp;
opp=pm;
while(opp!
=NULL)
{
printf("%s",opp->wenben);
printf("\n");
opp=opp->Next;
}
}
//整行插入函数
add(llinkpn)
{
llinkpss=pn;
llinkpst=pn;
llinkpsv;
charoo[80];
intm,n;
printf("插入行位置,两行之间\n");
scanf("%d,%d",&m,&n);
getchar();
while(pss->num!
=m)
pss=pss->Next;
while(pst->num!
=n)
pst=pst->Next;
psv=(llink)malloc(sizeof(Node));
printf("请为要插入的行初始化\n");
gets(oo);
strcpy(psv->wenben,oo);
if(m>n)
{
pst->Next=psv;
psv->Next=pss;
psv->num=n+1;
for(;pss!
=NULL;pss=pss->Next)
pss->num++;
}
else{
pss->Next=psv;
psv->Next=pst;
psv->num=m+1;
for(;pst!
=NULL;pst=pst->Next)
pst->num++;
}
dayin(pn);
}
//整行查找
zhengcha(llinkpj)
{
intj;
printf("请输入要查找的行数\n");
scanf("%d",&j);
getchar();
while(pj->num!
=j)
pj=pj->Next;
printf("该行为\n");
puts(pj->wenben);
}
//两行互换
huhuan(llinkkm)
{
intm,n;
llinkpss=km;
llinkpst=km;
charma[80];
printf("请输入要互换的两行\n");
scanf("%d,%d",&m,&n);
getchar();
printf("互换后的文本为\n");
while(pss->num!
=m)
pss=pss->Next;
while(pst->num!
=n)
pst=pst->Next;
strcpy(ma,pss->wenben);
strcpy(pss->wenben,pst->wenben);
strcpy(pst->wenben,ma);
dayin(km);
}
//主程序
main()
{
lstring*s=NULL,*p,*head,*t,*bv=NULL,*cha,*op,*ti;
llinkHead=NULL,ptr;
llinkvary=Head;llinkfir,las;llinkpss=Head;
inthang=7;inti,k;llinkpst=Head;
intking,labb,pos,len,c,d,charu,chang;
charstr[1000],bvl[1000],oo[80];chara,b;
ptr=(llink)malloc(sizeof(Node));
Head=ptr;
strcpy(ptr->wenben,fei[0]);
ptr->num=1;
for(i=1;i{
ptr->Next=(llink)malloc(sizeof(Node));
strcpy(ptr->Next->wenben,fei[i]);
ptr->Next->num=i+1;
ptr=ptr->Next;
}
ptr->Next=NULL;//为最后一个指针付一个方向,不然会输出错误
//到此大文本初始化结束,Head指向该链表头
printf("请初始化字符串\n");
gets(str);p=chushi(s,str);function();
for(;;)
{scanf("%d",&king);
getchar();
switch(king)
{case1:
{
printf("请分别输入从第几个字符开始删除,删除的个数\n");
printf("两个数字间以逗号隔开\n");
scanf("%d,%d",&pos,&len);
head=strdelete(p,pos,len);
printf("经删除后的新串为:
\n");
dispstr(head);printf("\n");
printf("还可进行其它功能选择\n");
function();break;}
case2:
{printf("请输入要查询的信息,包括查询的开始位置,查询的字符个数\n");
scanf("%d,%d",&c,&d);
head=substr(p,c,d);
dispstr(head);function();break;}
case3:
{
printf("在第pos个字符前插入串t\n");
printf("请输入字符串t\n");gets(bvl);
t=chushi(bv,bvl);op=t->next;
printf("请输入插入位置\n");
scanf("%d",&charu);cha=insert(p,charu,op);
printf("插入后的串为:
\n");dispstr(cha);
function();break;}
case5:
{
freelist(p);exit
(1);
}
case4:
{printf("请分别输入替换字符和被替换字符,以逗号隔开\n");
scanf("%c,%c",&a,&b);ti=trans(p,b,a);
printf("替换后的字符串为:
\n");dispstr(ti);
break;}
case6:
{chang=length(p);
printf("此时串长为:
%d\n",chang);
function();break;
}
case7:
{
dayin(Head);function();break;}
case8:
{
printf("请输入要删除的行数\n");
scanf("%d",&k);getchar();
if(k==1)
{ptr=Head;
Head=Head->Next;
for(;ptr!
=NULL;ptr=ptr->Next)
ptr->num--;hang--;
if(hang==0)
printf("文本已全部被删除\n");
else
printf("删除后的文本为\n");dayin(Head);
}
elseif(k==hang)
{ptr=Head;
while(ptr->Next->num!
=hang)
ptr=ptr->Next;
ptr->Next=NULL;hang--;
printf("删除后的文本为\n");dayin(Head);}
else{
ptr=Head;
while(ptr->Next->num!
=k)
ptr=ptr->Next;ptr->Next=ptr->Next->Next;
for(;ptr->Next!
=NULL;ptr=ptr->Next)
ptr->Next->num--;
hang--;dayin(Head);
}
function();break;
}
case9:
{
printf("如果插在第一行请按1,插在最后一行请按2,中间按3\n");
scanf("%d",&labb);getchar();
switch(labb)
{
case1:
{printf("请为要插入的字符串初始化\n");
fir=(llink)malloc(sizeof(Node));gets(oo);
strcpy(fir->wenben,oo);fir->num=1;
for(i=0;vary!
=NULL;i++,vary=vary->Next)
vary->num++;fir->Next=Head;
Head=fir;pss=Head;
pst=Head;vary=Head;hang++;dayin(Head);break;}
case2:
{printf("请为要插入的字符串初始化\n");
las=(llink)malloc(sizeof(Node));
gets(oo);
strcpy(las->wenben,oo);
for(i=0;pss->Next!
=NULL;i++,pss=pss->Next)
;
pss->Next=las;
las->Next=NULL;
las->num=pss->num+1;
hang++;dayin(Head);break;}
case3:
{
add(Head);hang++;break;}}
function();break;}
case10:
{zhengcha(Head);function();break;}
case11:
{huhuan(Head);function();break;
}}}}