当前位置:文档之家› 数据结构实验报告3链串

数据结构实验报告3链串

宁波工程学院电信学院计算机教研室实验报告一、实验目的1)熟悉串的定义和串的基本操作。

2 )掌握链串的基本运算。

3 )加深对串数据结构的理解,逐步培养解决实际问题的编程能力。

二、实验环境装有Visual C ++ 6.0的计算机。

三、实验内容编写一个程序,实现链串的各种基本运算,并在此基础上设计一个主程序。

具体如下:编写栈的基本操作函数链串类型定义如下所示:typedef struct sno de{char data;struct snode *n ext;}listri ng;(1)串赋值Assig n(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 w i w StrLength(s))个字符开始的、由连续j 个字符组成的子串。

( 7)插入InsStr (s,i,t)将串t 插入到串s 的第i(1 w i w StrLength(s)+1) 个字符中,即将t的第一个字符作为s 的第i 个字符,并返回产生的新串( 8)串删除DelStr (s,i,j)从串s 中删去从第i(1 w i w StrLength(s)) 个字符开始的长度为j 的子串,并返回产生的新串。

(9)串替换RepStr (s,s1,s2)在串s 中,将所有出现的子串s1 均替换成s2 。

(10)输出串DispStr(s)输出串s 的所有元素值(11 )判断串是否为空IsEmpty(s)编写主函数调用上述函数实现下列操作:(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<stdio.h>#include<stdlib.h>typedef struct snode{char data;struct snode *next;}listring;// 字符串赋值void strassign(listring *&s,char cstr[]){ int i;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;}// 字符串复制void strcopy(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;}// 字符串长度int strlength(listring *s){int i=0;listring *p=s->next; while(p!=NULL){ i++; p=p->next;} return i;}// 判断字符串是否相等int strequal(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) return 1;else return 0;}// 字符串连接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;return str;}// 字符串的子串listring *substr(listring *s,int i,int j){int k;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)) return str;for(k=0;k<i-1;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;return str;}// 字符串插入listring *insstr(listring *s,int i,listring *t){int k;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)return str;for(k=1;k<i;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;return str;}// 字符串删除listring *delstr(listring *s,int i,int j){int k;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)) return str;for(k=0;k<i-1;k++){q=(listring *)malloc(sizeof(listring)); q->data=p->data;r->next=q;r=q;p=p->next;} for(k=0;k<j;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; return str;}// 字符串替换listring *repstr(listring *s,int i,int j,listring *t){ int k;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)) return str;for(k=0;k<i-1;k++){ q=(listring *)malloc(sizeof(listring)); q->data=p->data;r->next=q; r=q; p=p->next;} for(k=0;k<j;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;return str;}// 字符串输出void dispstr(listring *s){listring *p=s->next;while(p!=NULL){printf("%c",p->data); p=p->next;}printf("\n");}// 判断字符串是否为空void empstr(listring *s){if(s->next==NULL)printf(" 字符串是空的!");elseprintf(" 字符串不为空!");}void initstr(listring *&s){s=(listring *)malloc(sizeof(listring)); s->next=NULL;}// 主函数int main(void){listring *s,*s1,*t,*t1,*s2,*s3,*s4,*s5,*s6; int l;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 相等!");elseprintf("s1 与s5 不相等!");return 0;}运行结果:四、实验心得与小结这次上机的内容是实现链串的基本算法,跟前面学的链表的基本算法是差不多的,所以这次实验还是比较简单的,但也曾出现过一点点小问题,直接把字符串赋值给指针s="abcdefghijklmn"; s1="xyz"; t="hijk"; 结果出现如下错误:通过调用函数void strassign(listring *&s,char cstr[]) 将其订正为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; 后运行正确。

相关主题