数据结构 串的应用及实现 报告.docx

上传人:b****5 文档编号:5802271 上传时间:2023-01-01 格式:DOCX 页数:12 大小:64.53KB
下载 相关 举报
数据结构 串的应用及实现 报告.docx_第1页
第1页 / 共12页
数据结构 串的应用及实现 报告.docx_第2页
第2页 / 共12页
数据结构 串的应用及实现 报告.docx_第3页
第3页 / 共12页
数据结构 串的应用及实现 报告.docx_第4页
第4页 / 共12页
数据结构 串的应用及实现 报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构 串的应用及实现 报告.docx

《数据结构 串的应用及实现 报告.docx》由会员分享,可在线阅读,更多相关《数据结构 串的应用及实现 报告.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构 串的应用及实现 报告.docx

数据结构串的应用及实现报告

实习报告

课程名称:

数据结构

实验名称:

串及其应用

指导教师:

学生班级:

学生姓名:

学生学号:

完成日期:

一、需求分析

1、本演示程序用C语言编写,实现串的堆分配存储基本操作、串的建立、串的输出、串的联接、求子串、串匹配、串的插入删除、串的替换等实现方法。

2、程序所达到的功能:

(1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk”

(2)复制串t到t1,并输出t1的长度

(3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2

(4)删除s第2个字符开始的5个字符而产生串s3,并输出s3

(5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4

(6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5

(7)将串s1和串t连接起来而产生串s6,并输出s6

(8)比较串s1和s5是否相等,输出结果

二、概要设计

1、编写栈的基本操作函数

链串类型定义如下所示:

typedefstructsnode{

chardata;

structsnode*next;

}listring;

(1)串赋值Assign(s,t)

⏹将一个字符串常量赋给串s,即生成一个其值等于t的串s

(2)串复制StrCopy(s,t)

⏹将串t赋给串s

(3)计算串长度StrLength(s)

⏹返回串s中字符个数

(4)判断串相等StrEqual(s,t)

⏹若两个串s与t相等则返回1;否则返回0。

(5)串连接Concat(s,t)

⏹返回由两个串s和t连接在一起形成的新串。

(6)求子串SubStr(s,i,j)

⏹返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j个字符组成的子串。

(7)插入InsStr(s,i,t)

⏹将串t插入到串s的第i(1≤i≤StrLength(s)+1)个字符中,即将t的第一个字符作为s的第i个字符,并返回产生的新串

(8)串删除DelStr(s,i,j)

⏹从串s中删去从第i(1≤i≤StrLength(s))个字符开始的长度为j的子串,并返回产生的新串。

(9)串替换RepStr(s,s1,s2)

⏹在串s中,将所有出现的子串s1均替换成s2。

(10)输出串DispStr(s)

⏹输出串s的所有元素值

(11)判断串是否为空IsEmpty(s)

2、编写主函数

调用上述函数实现下列操作:

(1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk”

(2)复制串t到t1,并输出t1的长度

(3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2

(4)删除s第2个字符开始的5个字符而产生串s3,并输出s3

(5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4

(6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5

(7)将串s1和串t连接起来而产生串s6,并输出s6

(8)比较串s1和s5是否相等,输出结果

三、程序清单

#include

#include

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;

}

//字符串复制

voidstrcopy(listring*&s,listring*t){

listring*p=t->next,*q,*r;

s=(listring*)malloc(sizeof(listring));

r=s;

while(p!

=NULL){

q=(listring*)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

}

//字符串长度

intstrlength(listring*s){

inti=0;

listring*p=s->next;

while(p!

=NULL){

i++;

p=p->next;

}

returni;

}

//判断字符串是否相等

intstrequal(listring*s,listring*t){

listring*p=s->next,*q=t->next;

while(p!

=NULL&&q!

=NULL&&p->data==q->data){

p=p->next;

q=q->next;

}

if(p==NULL&&q==NULL)

return1;

else

return0;

}

//字符串连接

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;

}

//字符串的子串

listring*substr(listring*s,inti,intj){

intk;

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

p=p->next;

for(k=1;k<=j;k++){

q=(listring*)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

returnstr;

}

//字符串插入

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;

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;

}

for(k=0;k

p=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));

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;

}

for(k=0;k

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;

}

//字符串输出

voiddispstr(listring*s){

listring*p=s->next;

while(p!

=NULL){

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//判断字符串是否为空

voidempstr(listring*s){

if(s->next==NULL)

printf("字符串是空的!

");

else

printf("字符串不为空!

");

}

voidinitstr(listring*&s){

s=(listring*)malloc(sizeof(listring));

s->next=NULL;

}

intmain(void){

listring*s,*s1,*t,*t1,*s2,*s3,*s4,*s5,*s6;

intl;

strassign(s,"abcdefghijklmn");

strassign(s1,"xyz");

strassign(t,"hijk");

strcopy(t1,t);

printf("输出t1的长度:

%d\n",strlength(t1));

s2=insstr(s,9,s1);

printf("输出s2:

\n");

dispstr(s2);

s3=delstr(s,2,5);

printf("输出s3:

\n");

dispstr(s3);

s4=repstr(s,2,3,s1);

printf("输出s4:

\n");

dispstr(s4);

s5=substr(s,8,4);

printf("输出s5:

\n");

dispstr(s5);

s6=concat(s1,t);

printf("输出s6:

\n");

dispstr(s6);

l=strequal(s1,s5);

if(l==1)

printf("s1与s5相等!

");

else

printf("s1与s5不相等!

");

return0;

}

四、调试分析

这次上机的内容是实现链串的基本算法,跟前面学的链表的基本算法是差不多的,所以这次实验还是比较简单的,但也曾出现过一点点小问题,直接把字符串赋值给指针s="abcdefghijklmn";s1="xyz";t="hijk";结果出现如下错误:

通过调用函数voidstrassign(listring*&s,charcstr[])将其订正为strassign(s,"abcdefghijklmn");strassign(s1,"xyz");strassign(t,"hijk");后没有错误;编译、组建都没有错误的情况下,s2是在串s的第9个字符位置插入串s1而产生的,本应出现的结果为

可运行时却出现如下的结果

查找了原因之后才发现在插入s1数据时,都把s的第九个字母的数据赋值给了s2,*p1=s1->next;q->data=p->data;

把错误改为q->data=p1->data;后运行正确。

虽然链串的基本算法的操作还是比较简单,但也会犯一些毛病,必须通过上机编译调试才能发现,上机之后才能把自认为对的代码重新纠正过来,从而有所进步。

通过这次的上机实验,我熟悉了串的定义和串的基本操作,掌握了链串的基本运算,加深对串数据结构的理解并逐步培养解决实际问题的编程能力。

五、用户使用说明

双击串的实现.exe。

程序名为串的实现.exe,运行环境为DOS。

程序执行后显示

六、实验运行结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1