数据结构实验4顺序串和链串的实现.docx
《数据结构实验4顺序串和链串的实现.docx》由会员分享,可在线阅读,更多相关《数据结构实验4顺序串和链串的实现.docx(20页珍藏版)》请在冰豆网上搜索。
![数据结构实验4顺序串和链串的实现.docx](https://file1.bdocx.com/fileroot1/2023-2/5/3b49b281-daca-41b9-bb78-74bfd6e73055/3b49b281-daca-41b9-bb78-74bfd6e730551.gif)
数据结构实验4顺序串和链串的实现
《数据结构》课程实验报告
实验名称
顺序串和链串的实现
实验序号
4
实验日期
2012-5-2
姓名
曹志华
院系
计算机科学与信息工程学院
班级
10104115
学号
1010411501
专业
计算机科学与技术
指导教师
武伟
成绩
教师评语
一、实验目的和要求
1.理解串和一般线性表之间的差异;
2.重点理解在顺序串上和链串上实现串的基本运算算法;
3.掌握串的简单匹配算法和KMP算法;
4.灵活运算串这种数据结构解决一些基本问题。
二、实验项目摘要
实验1:
编写一个程序,实现顺序串的各种基本算法,并在此基础上设计一个主程序完成如下功能:
1.建立串s=“abcdefghefghijklmn”和串s1=“xyz”
2输出串s
3输出串s的长度
4在串s的第9个字符位置插入串s1而产生c串s2
5输出串s2
6删除串s第2个字符开始的5个字符替换成串s2
7输出串s2
8将串s的第2个字符开始的5个字符替换成串s1而产生串s2
9输出串s2
10提取串s的第2个字符开始的10个字符而产生串s3
11输出串s3
12将串s1和串s2连接起来而产生串s4
13输出串s4
实验2:
编写一个程序,实现链串的各种基本算法,并在此基础上设计一个主程序完成如下功能:
1.建立串s=“abcdefghefghijklmn”和串s1=“xyz”
2输出串s
3输出串s的长度
4在串s的第9个字符位置插入串s1而产生c串s2
5输出串s2
6删除串s第2个字符开始的5个字符替换成串s2
7输出串s2
8将串s的第2个字符开始的5个字符替换成串s1而产生串s2
9输出串s2
10提取串s的第2个字符开始的10个字符而产生串s3
11输出串s3
12将串s1和串s2连接起来而产生串s4
13输出串s4
三、实验预习内容
1.首先掌握串的基本概念:
串是由零个或多个字符组成的有限序列;
2.灵活掌握串的存储结构
3.掌握串的顺序存储结构和链式存储结构
●串赋值运算算法
●串复制运算算法
●求串长运算算法
●判断串相等运算算法
●串连接运算算法
●求子串运算算法
●查找子串位置运算算法
●子串插入运算算法
●子串删除运算算法
●子串替换运算算法
●输出串运算算法
4.理解串的模式匹配
三、实验结果与分析
实验结果:
实验1:
实验2:
实验分析:
通过本次试验,我了解并掌握了串的基础知识,并利用串的顺序存储结构和链式存储结构,编写了两个程序,串是一种线性结构,是由零个或多个字符组成的优先序列,串的处理在计算机非数值处理中占有重要的地位,如信息检索系统、文字编辑等都以串作为处理对象。
所以串很重要。
在今后的学习中我会多加练习,更熟练的掌握串的应用。
源代码:
实验1:
#include
#include
#defineMaxSize1024
typedefcharElemType;
typedefstruct
{
chardata[MaxSize];
intlength;
}SqString;
//建立串s
voidStrAssign(SqString&s,charcstr[])//串的赋值(s为引用型参数)
{
inti;
for(i=0;cstr[i]!
='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
//串长运算
intStrLength(SqStrings)
{
return(s.length);
}
//子串插入
SqStringInsStr(SqStrings1,inti,SqStrings2)
{
intj;
SqStringstr;
str.length=0;
if(i<=0||i>s1.length+1)//参数不正常时返回空串
returnstr;
for(j=0;ji-2】复制到str
str.data[j]=s1.data[j];
for(j=0;js2.length-1】复制到str
str.data[i+j-1]=s2.data[j];
for(j=i-1;jstr.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
returnstr;
}
//删除串
SqStringDelStr(SqStrings,inti,intj)
{
intk;
SqStringstr;
str.length=0;
if(i<=0||i>s.length||i+j>s.length+1)//参数不正常时返回空串
returnstr;
for(k=0;ki-2】复制到str
str.data[k]=s.data[k];
for(k=i+j-1;kstr.data[k-j]=s.data[k];
str.length=s.length-j;
returnstr;
}
//子串替换
SqStringRepStr(SqStrings,inti,intj,SqStringt)
{
intk;
SqStringstr;
if(i<=0||i>s.length||i+j>s.length)//参数不正常时返回空串
returnstr;
for(k=0;ki-2】复制到str
str.data[k]=s.data[k];
for(k=0;kt.length】复制到str
str.data[i+k-1]=t.data[k];
for(k=i+j-1;kstr.data[k-j]=s.data[k];
str.length=s.length-j+t.length;
returnstr;
}
//提取串--求子串
SqStringSuStr(SqStrings,inti,intj)
{
SqStringstr;
intk;
str.length=0;
if(i<=0||i>s.length||j<0||i+j-1>s.length)
returnstr;//参数不正常时返回空串
for(k=i-1;k
str.data[k-i+1]=s.data[k];
str.length=j;
returnstr;
}
//串连接
SqStringConcat(SqStrings,SqStringt)
{
SqStringstr;
inti;
str.length=s.length+t.length;
for(i=0;istr.data[i]=s.data[i];
for(i=0;istr.data[s.length+1]=t.data[i];
returnstr;
}
//输出串
intDisStr(SqStrings)
{
inti;
if(s.length>0)
{
for(i=0;iprintf("%c",s.data[i]);
printf("\n");
}
}
//主函数
voidmain()
{
SqStrings,s1,s2,s3,s4;
printf("1.建立串s=abcdefghefghijklmn和串s1=xyz");
printf("\n");
StrAssign(s,"abcdefghijklmn");
StrAssign(s1,"xyz");
printf("\n");
printf("2.输出串s");DisStr(s);
printf("\n");
printf("3.输出串s的长度:
%d\n",StrLength(s));
printf("\n");
printf("4.在串s的第9个字符位置插入串s1而产生c串s2\n");
s2=InsStr(s,9,s1);
printf("\n");
printf("5.输出s2:
");DisStr(s2);
printf("\n\n");
printf("6.删除串s第2个字符开始的5个字符替换成串s2\n");
s2=DelStr(s,2,5);
printf("\n");
printf("7.输出串s2:
");DisStr(s2);
printf("\n");
printf("8.将串s的第2个字符开始的5个字符替换成串s1而产生串s2\n");
s2=RepStr(s,2,5,s1);
printf("\n");
printf("9.输出串s2:
");DisStr(s2);
printf("\n");
printf("10.提取串s的第2个字符开始的10个字符而产生串s3\n");
s3=SuStr(s,2,10);
printf("\n");
printf("11.输出串s3:
");DisStr(s2);
printf("\n");
printf("12.将串s1和串s2连接起来而产生串s4\n");
s4=Concat(s1,s2);
printf("\n");
printf("13.输出串s4:
");DisStr(s2);
printf("\n");
}
实验2:
#include
#include
#defineMaxSize1024
typedefcharElemType;
typedefstructsnode
{
chardata;
structsnode*next;
}LiString;
//建立串--赋值
voidStrAssign(LiString*&s,charcstr[])
{
inti;
LiString*r,*p;
s=(LiString*)malloc(sizeof(LiString));
r=s;
for(i=0;cstr[i]!
='\0';i++)
{
p=(LiString*)malloc(sizeof(LiString));
p->data=cstr[i];
r->next=p;r=p;
}
r->next=NULL;
}
////串长运算
intStrLength(LiString*s)
{
inti=0;
LiString*p=s->next;
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
//子串插入
LiString*InsStr(LiString*s,inti,LiString*t)
{
intk;
LiString*str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)+1)
returnstr;
for(k=1;k
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
while(p1!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p1->data;
r->next=q;r=q;
p1=p1->next;
}
while(p!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
returnstr;
}
//删除串
LiString*DelStr(LiString*s,inti,intj)
{
intk=0;
LiString*str,*p=s->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0)
returnstr;
for(k=1;k{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
for(k=0;kp=p->next;
while(p!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
returnstr;
}
////子串替换
LiString*RepStr(LiString*s,inti,intj,LiString*t)
{
intk;
LiString*str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
returnstr;
for(k=0;k{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;r=q;
p=p->next;
}
for(k=0;kp=p->next;
while(p1!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p1->data;q->next=NULL;
r->next=q;r=q;
p1=p1->next;
}
while(p!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
returnstr;
}
//提取串--求子串
LiString*SuStr(LiString*s,inti,intj)
{
intk=0;
LiString*str,*p=s->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
returnstr;
for(k=0;k{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
returnstr;
}
//串连接
LiString*Concat(LiString*s,LiString*t)
{
LiString*str,*p=s->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
r=str;
while(p!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
p=t->next;
while(p!
=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
returnstr;
}
//输出串
intDisStr(LiString*s)
{
LiString*p=s->next;
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
//主函数
voidmain()
{
LiString*s,*s1,*s2,*s3,*s4;
printf("1.建立串s=abcdefghefghijklmn和串s1=xyz");
printf("\n");
StrAssign(s,"abcdefghijklmn");
StrAssign(s1,"xyz");
printf("\n");
printf("2.输出串s");DisStr(s);
printf("\n");
printf("3.输出串s的长度:
%d\n",StrLength(s));
printf("\n");
printf("4.在串s的第9个字符位置插入串s1而产生c串s2\n");
s2=InsStr(s,9,s1);
printf("\n");
printf("5.输出s2:
");DisStr(s2);
printf("\n\n");
printf("6.删除串s第2个字符开始的5个字符替换成串s2\n");
s2=DelStr(s,2,5);
printf("\n");
printf("7.输出串s2:
");DisStr(s2);
printf("\n");
printf("8.将串s的第2个字符开始的5个字符替换成串s1而产生串s2\n");
s2=RepStr(s,2,5,s1);
printf("\n");
printf("9.输出串s2:
");DisStr(s2);
printf("\n");
printf("10.提取串s的第2个字符开始的10个字符而产生串s3\n");
s3=SuStr(s,2,10);
printf("\n");
printf("11.输出串s3:
");DisStr(s2);
printf("\n");
printf("12.将串s1和串s2连接起来而产生串s4\n");
s4=Concat(s1,s2);
printf("\n");
printf("13.输出串s4:
");DisStr(s2);
printf("\n");
}
注:
空间不够,可以增加页码。