数据结构-顺序串基本操作实验报告

合集下载

数据结构串的基本操作及应用实验报告

数据结构串的基本操作及应用实验报告

实验日期2010.5.10 教师签字成绩实验报告【实验名称】第四章串的基本操作及应用【实验目的】1、熟悉将算法转换成程序代码的过程。

2、了解串的逻辑结构特性,熟练掌握串顺序存储结构的C 语言描述方法。

3、熟练掌握串的基本操作:求长度、串的连接、插入、删除等,掌握串的存取特性。

【实验原理】1.串可以可以有三种存储方式,分别为顺序存储、堆分配存储、链式存储,串的基本操作在这三种存储方式下操作。

2.串的模式匹配KMP算法在每一趟匹配过程中出现字符不等时,不需回溯指针,而是利用已经得到的部分匹配结果的结果将模式向右滑动尽可能远的一段距离,继续进行比较。

【实验内容】1.串的顺序存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)#include<stdio.h>#include<iostream.h>#include<malloc.h>#include<string.h>#define SIZE 20struct HString{char ch[SIZE];int length;};void StrInsert(HString &s,int pos,HString t){int i,j;if(pos<1||pos>s.length+1)cout<<"ERROR!";if(t.length){for(i=s.length-1;i>=pos-1;--i)s.ch[i+t.length]=s.ch[i];for(j=0;j<=t.length-1;j++)s.ch[pos-1+j]=t.ch[j];s.length+=t.length;}}void StrDelete(HString &s,int pos,int len){int i;int v=pos-1;if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!";for(i=pos+len-1;i<=s.length-1;i++)s.ch[v++]=s.ch[i];s.length-=len;}void StrAssign(HString &t,char chars[]){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.length=0;}else{for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}int StrLen(HString &s){return s.length;}int StrCompare(HString &s,HString t){for(int i=0;i<s.length&&i<t.length;i++){if(s.ch[i]!=t.ch[i])return (int)(t.ch[i]-s.ch[i]);}return s.length-t.length;}void Concat(HString &t,HString s1,HString s2){int i=s1.length+s2.length;for(i=0;i<s1.length;i++)t.ch[i]=s1.ch[i];t.length=s1.length+s2.length;for(i=s1.length;i<t.length;i++)t.ch[i]=s2.ch[i-s1.length];}int SubString(HString &sub,HString s,int pos,int len) {if(pos<1||pos>s.length||len<0||len>s.length-pos+1) {cout<<"ERROR!"<<endl;return 0;}if(!len){sub.length=0;}else{int i=len;for(i=0;i<len;i++)sub.ch[i]=s.ch[pos+i-1];sub.length=len;}}void Display(HString &t){for(int i=0;i<=t.length-1;i++)cout<<t.ch[i];cout<<endl;}void main(){int i;char s[20];do{cout<<"选择您要进行的串的基本操作:"<<endl;cout<<"1.插入"<<endl<<"2.删除"<<endl<<"3.串连结"<<endl<<"4.取子串"<<endl<<"5.串比较"<<endl<<"6.求串长"<<endl<<"7.结束"<<endl;cin>>i;switch(i){case 1:{HString s,t;int pos;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<endl;cout<<"请输入要插入的串t:";cin>>t.ch;StrAssign(t,t.ch);cout<<endl;cout<<"请输入你所要插入的位置:";cin>>pos;StrInsert(s,pos,t);cout<<"插入之后串变为:";Display(s);break;}case 2:{HString s;int pos,len;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入你所要删除串的首位置为:";cin>>pos;cout<<"请输入你需要删除的串的长度:";cin>>len;StrDelete(s,pos,len);cout<<"删除之后串变为:";Display(s);break;}case 3:{HString s1,s2,t;cout<<"请输入串s1:";cin>>s1.ch;StrAssign(s1,s1.ch);cout<<"请输入串s2:";cin>>s2.ch;StrAssign(s2,s2.ch);Concat(t,s1,s2);cout<<"s1与s2合并后的串为:";Display(t);break;}case 4:{HString sub,s;int pos,len;cout<<"请输入主串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入所取原串的起始位置pos:";cin>>pos;cout<<"请输入子串的长度len:";cin>>len;SubString(sub,s,pos,len);cout<<"取出的子串为:";Display(sub);break;}case 5:{HString s,t;int value;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入串t:";cin>>t.ch;StrAssign(t,t.ch);value=StrCompare(s,t);if(value>0) cout<<"串s大于串t"<<endl;else if(value==0) cout<<"串s等于串t"<<endl;else cout<<"串s小于串t"<<endl;cout<<endl;break;}case 6:HString s;char *chars;int val;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);val=StrLen(s);cout<<"串的长度为:"<<val<<endl;break;case 7:cout<<"操作结束!"<<endl;break;default:cout<<"输入错误!请重新输入!"<<endl;break;}}while(i!=7);}2.串的堆分配存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)#include<stdio.h>#include<iostream.h>#include<malloc.h>#include<string.h>struct HString{char *ch;int length;};void StrInsert(HString &s,int pos,HString t){int i,j;if(pos<1||pos>s.length+1)cout<<"ERROR!";if(t.length){s.ch=(char*)realloc(s.ch,(s.length+t.length)*sizeof(char));for(i=s.length-1;i>=pos-1;--i)s.ch[i+t.length]=s.ch[i];for(j=0;j<=t.length-1;j++)s.ch[pos-1+j]=t.ch[j];s.length+=t.length;}}void StrDelete(HString &s,int pos,int len){int i;int v=pos-1;if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!";for(i=pos+len-1;i<=s.length-1;i++)s.ch[v++]=s.ch[i];s.length-=len;}void StrAssign(HString &t,char *chars){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.ch=NULL;t.length=0;}else{t.ch=(char *)malloc(i*sizeof(char));for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}int StrLen(HString &s){return s.length;}int StrCompare(HString &s,HString t){for(int i=0;i<s.length&&i<t.length;i++){if(s.ch[i]!=t.ch[i])return (int)(t.ch[i]-s.ch[i]);}return s.length-t.length;}void Concat(HString &t,HString s1,HString s2){int i=s1.length+s2.length;t.ch=(char *)malloc(i*sizeof(char));for(i=0;i<s1.length;i++)t.ch[i]=s1.ch[i];t.length=s1.length+s2.length;for(i=s1.length;i<t.length;i++)t.ch[i]=s2.ch[i-s1.length];}int SubString(HString &sub,HString s,int pos,int len){if(pos<1||pos>s.length||len<0||len>s.length-pos+1){cout<<"ERROR!"<<endl;return 0;}if(!len){sub.ch=NULL;sub.length=0;}else{int i=len;sub.ch=(char *)malloc(i*sizeof(char));for(i=0;i<len;i++)sub.ch[i]=s.ch[pos+i-1];sub.length=len;}}void Display(HString &t){for(int i=0;i<=t.length-1;i++)cout<<t.ch[i];cout<<endl;}void main(){int i;char s[20];cout<<"选择您要进行的串的基本操作:"<<endl;do{cout<<"1.插入"<<endl<<"2.删除"<<endl<<"3.串连结"<<endl<<"4.取子串"<<endl<<"5.串比较"<<endl<<"6.求串长"<<endl<<"7.结束"<<endl;cin>>i;switch(i){case 1:{HString s,t;char a[20],b[20];char *sa,*sb;int pos;cout<<"请输入串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<endl;cout<<"请输入要插入的串t:";cin>>b;sb=b;StrAssign(t,sb);cout<<endl;cout<<"请输入你所要插入的位置:";cin>>pos;StrInsert(s,pos,t);cout<<"插入之后串变为:";Display(s);break;}case 2:{HString s;char str[20];char *chars;int pos,len;cout<<"请输入串s:";cin>>str;chars=str;StrAssign(s,chars);cout<<"请输入你所要删除串的首位置为:";cin>>pos;cout<<endl;cout<<"请输入你需要删除的串的长度:";cin>>len;cout<<endl;StrDelete(s,pos,len);cout<<"删除之后串变为:";Display(s);break;}case 3:{HString s1,s2,t;char a[20],b[20];char *sa,*sb;cout<<"请输入串s1:";cin>>a;sa=a;StrAssign(s1,sa);cout<<"请输入串s2:";cin>>b;sb=b;StrAssign(s2,sb);Concat(t,s1,s2);cout<<"s1与s2合并后:";Display(t);break;}case 4:{HString sub,s;char a[20];char *sa;int pos,len;cout<<"请输入主串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入所取原串的起始位置pos:";cin>>pos;cout<<"请输入子串的长度len:";cin>>len;SubString(sub,s,pos,len);cout<<"该子串为:";Display(sub);break;}case 5:{HString s,t;int value;char a[20],b[20];char *sa,*sb;cout<<"请输入串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入串t:";cin>>b;sb=b;StrAssign(t,sb);value=StrCompare(s,t);if(value>0) cout<<"串s大于串t"<<endl;else if(value==0) cout<<"串s等于串t"<<endl;else cout<<"串s小于串t"<<endl;cout<<endl;break;}case 6:HString s;char str[20];char *chars;int val;cout<<"请输入串s:";cin>>str;chars=str;StrAssign(s,chars);val=StrLen(s);cout<<"串的长度为:"<<val<<endl;break;case 7:cout<<"操作结束!"<<endl;break;default:cout<<"输入错误!请重新输入!"<<endl;break;}}while(i!=7);3.KMP算法的C实现#include<iostream.h>#include<malloc.h>#include<string.h>struct HString{char *ch;int length;};void StrAssign(HString &t,char *chars){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.ch=NULL;t.length=0;}else{t.ch=(char *)malloc(i*sizeof(char));for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}void get_next(HString s,int next[]){int i,j;i=1;j=0;next[1]=0;while(i<s.length){if(j==0||s.ch[i-1]==s.ch[j-1]){i++;j++;next[i]=j;}else j=next[j];}for(i=1;next[i]!='\0';i++)cout<<next[i]<<" ";}int Index(HString s,HString t,int pos){int i=pos;int j=1;int next[20];get_next(t,next);while(i<=s.length&&j<=t.length){if(s.ch[i-1]==t.ch[j-1]||j==0){ ++i;++j;}else{j=next[j];}}if(j>t.length)return i-t.length;else return 0;}void Display(HString t){for(int i=0;i<t.length;i++)cout<<t.ch[i];cout<<endl;}void main(){ HString s,t;int pos,k;char a[20],b[20];char *sa,*sb;cout<<"请输入主串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入模式串t:";cin>>b;sb=b;StrAssign(t,sb);cout<<"请输入起始位置pos:";cin>>pos;k=Index(s,t,pos);if(k==0)cout<<"匹配失败!"<<endl<<endl;else{cout<<"从第"<<k<<"个位置开始匹配"<<endl;Display(s);for(int i=1;i<k;i++)cout<<" ";Display(t);}}【小结讨论】1. 此程序关键在于位置查询,由于对C语言函数的陌生导致问题变的繁琐,自己的C语言水平有待提高。

数据结构-顺序串基本操作实验报告

数据结构-顺序串基本操作实验报告
}
}
return(same);
}
int StrLength(SqString s)//计算串长度
(
return(s.length);
}
SqString Concat(SqString s,SqString t)〃串连接
(
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
(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的第2个字符开始的10个字符而产生串s5,并输出s5
(7)将串s1和串t连接起来而产生串s4,并输出s4
if(i<=0||i>s.length||j<0||i+j-1>s.length)
return str;
for(k=i-1;k<i+j-1;k++)
str.ch[k-i+1]=s.ch[k];
str.length=j;
return str;
}
SqString InsStr(SqString s1,int i,SqString s2)〃插入{
(9)串替换Rep所有出现的子串s1均替换成s2。
(10)输出串DispStr(s)
输出串s的所有元素值
(11)判断串是否为空IsEmpty(s)
为空返回1,不为空返回0
编写主函数

数据结构顺序串基本操作实验报告

数据结构顺序串基本操作实验报告

数据结构顺序串基本操作实验报告实验目的:1.掌握顺序串的定义和基本操作;2.掌握顺序串的插入、删除、查找等基本操作。

实验内容:实现顺序串的基本操作,包括串的初始化、插入、删除、查找、输出等操作,并通过实例测试验证操作的正确性。

实验原理:顺序串是一种以连续的存储空间来存储字符序列的数据结构。

在顺序串中,字符串的字符元素依次存储在一组连续的存储单元中,可以通过下标来访问和修改元素。

顺序串的基本操作包括初始化、插入、删除、查找等。

1.串的初始化:初始化一个空串,即将串的长度设置为0。

2.串的插入:在指定位置插入一个字符或字符串。

首先需要判断插入位置的合法性,即位置不能超过当前串的长度,并将插入位置后的元素后移一位,然后将要插入的元素放入指定位置。

3.串的删除:删除指定位置的字符或字符串。

首先需要判断删除位置的合法性,即位置不能超过当前串的长度,然后将删除位置后的元素前移一位。

4.串的查找:在串中查找指定字符或子串第一次出现的位置。

遍历串中的每个元素,检查是否与要查找的字符或子串相等,若相等则返回其位置。

5.串的输出:将串中的元素打印出来。

实验步骤:1.定义顺序串的数据结构。

使用数组来存储字符序列,并定义一个变量用于记录串的长度。

2.初始化一个空串。

将串的长度设置为0。

3.实现插入操作。

根据插入位置的合法性,判断是否需要进行插入操作。

如果插入位置超过了当前串的长度,则将元素插入到串末尾;否则,将插入位置后的元素后移一位,并将要插入的元素放入指定位置。

4.实现删除操作。

根据删除位置的合法性,判断是否需要进行删除操作。

如果删除位置超过了当前串的长度,则无需删除;否则,将删除位置后的元素前移一位。

5.实现查找操作。

遍历串中的每个元素,检查是否与要查找的字符或子串相等,若相等则返回其位置。

6.实现输出操作。

遍历串中的每个元素,将其打印出来。

7.构造测试实例,并进行验证。

实验结果:以插入、删除、查找等操作为例,构造测试实例进行验证:假设有一个空串,插入字符'A'到位置0:结果为"A";在串的末尾插入字符'B':结果为"AB";在位置1插入字符'C':结果为"ACB";删除位置3的字符:结果为"AC";查找字符'C'的位置:结果为1实验总结:本次实验主要是对顺序串的基本操作进行了实现和验证。

串-数据结构实验报告

串-数据结构实验报告

串-数据结构实验报告串数据结构实验报告一、实验目的本次实验的主要目的是深入理解和掌握串这种数据结构的基本概念、存储方式以及相关的操作算法。

通过实际编程实现串的基本操作,提高对数据结构的理解和编程能力,培养解决实际问题的思维和方法。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理(一)串的定义串是由零个或多个字符组成的有限序列。

在本次实验中,我们主要关注的是字符串。

(二)串的存储方式1、顺序存储定长顺序存储:使用固定长度的数组来存储字符串,长度不足时用特定字符填充。

堆分配存储:根据字符串的实际长度动态分配存储空间。

2、链式存储每个节点存储一个字符,并通过指针链接起来。

(三)串的基本操作1、串的创建和初始化2、串的赋值3、串的连接4、串的比较5、求子串6、串的插入和删除四、实验内容及步骤(一)顺序存储方式下串的实现1、定义一个结构体来表示顺序存储的字符串,包含字符数组和字符串的实际长度。

```cppstruct SeqString {char str;int length;};```2、实现串的创建和初始化函数```cppSeqString createSeqString(const char initStr) {int len = strlen(initStr);SeqString s;sstr = new charlen + 1;strcpy(sstr, initStr);slength = len;return s;}```3、串的赋值函数```cppvoid assignSeqString(SeqString& s, const char newStr) {delete sstr;int len = strlen(newStr);sstr = new charlen + 1;strcpy(sstr, newStr);slength = len;}```4、串的连接函数```cppSeqString concatSeqString(const SeqString& s1, const SeqString& s2) {SeqString result;resultlength = s1length + s2length;resultstr = new charresultlength + 1;strcpy(resultstr, s1str);strcat(resultstr, s2str);return result;}```5、串的比较函数```cppint compareSeqString(const SeqString& s1, const SeqString& s2) {return strcmp(s1str, s2str);}```6、求子串函数```cppSeqString subSeqString(const SeqString& s, int start, int len) {SeqString sub;sublength = len;substr = new charlen + 1;strncpy(substr, sstr + start, len);substrlen ='\0';return sub;}```7、串的插入函数```cppvoid insertSeqString(SeqString& s, int pos, const SeqString& insertStr) {int newLength = slength + insertStrlength;char newStr = new charnewLength + 1;strncpy(newStr, sstr, pos);strcpy(newStr + pos, insertStrstr);strcpy(newStr + pos + insertStrlength, sstr + pos);delete sstr;sstr = newStr;slength = newLength;}```8、串的删除函数```cppvoid deleteSeqString(SeqString& s, int start, int len) {int newLength = slength len;char newStr = new charnewLength + 1;strncpy(newStr, sstr, start);strcpy(newStr + start, sstr + start + len);delete sstr;sstr = newStr;slength = newLength;}```(二)链式存储方式下串的实现1、定义一个节点结构体```cppstruct LinkNode {char data;LinkNode next;LinkNode(char c) : data(c), next(NULL) {}};```2、定义一个链式存储的字符串类```cppclass LinkString {private:LinkNode head;int length;public:LinkString(const char initStr);~LinkString();void assign(const char newStr);LinkString concat(const LinkString& other);int compare(const LinkString& other);LinkString subString(int start, int len);void insert(int pos, const LinkString& insertStr);void deleteSub(int start, int len);};```3、实现各个函数```cppLinkString::LinkString(const char initStr) {length = strlen(initStr);head = NULL;LinkNode p = NULL;for (int i = 0; i < length; i++){LinkNode newNode = new LinkNode(initStri);if (head == NULL) {head = newNode;p = head;} else {p>next = newNode;p = p>next;}}}LinkString::~LinkString(){LinkNode p = head;while (p) {LinkNode temp = p;p = p>next;delete temp;}}void LinkString::assign(const char newStr) {//先释放原有的链表LinkNode p = head;while (p) {LinkNode temp = p;p = p>next;delete temp;}length = strlen(newStr);head = NULL;p = NULL;for (int i = 0; i < length; i++){LinkNode newNode = new LinkNode(newStri);if (head == NULL) {head = newNode;p = head;} else {p>next = newNode;p = p>next;}}}LinkString LinkString::concat(const LinkString& other) {LinkString result;LinkNode p1 = head;LinkNode p2 = otherhead;LinkNode p = NULL;while (p1) {LinkNode newNode = new LinkNode(p1->data);if (resulthead == NULL) {resulthead = newNode;p = resulthead;} else {p>next = newNode;p = p>next;}p1 = p1->next;}while (p2) {LinkNode newNode = new LinkNode(p2->data);if (resulthead == NULL) {resulthead = newNode;p = resulthead;} else {p>next = newNode;p = p>next;}p2 = p2->next;}resultlength = length + otherlength;return result;}int LinkString::compare(const LinkString& other) {LinkNode p1 = head;LinkNode p2 = otherhead;while (p1 && p2 && p1->data == p2->data) {p1 = p1->next;p2 = p2->next;}if (p1 == NULL && p2 == NULL) {return 0;} else if (p1 == NULL) {return -1;} else if (p2 == NULL) {return 1;} else {return p1->data p2->data;}}LinkString LinkString::subString(int start, int len) {LinkString sub;LinkNode p = head;for (int i = 0; i < start; i++){p = p>next;}for (int i = 0; i < len; i++){LinkNode newNode = new LinkNode(p>data);if (subhead == NULL) {subhead = newNode;} else {LinkNode temp = subhead;while (temp>next) {temp = temp>next;}temp>next = newNode;}p = p>next;}sublength = len;return sub;}void LinkString::insert(int pos, const LinkString& insertStr) {LinkNode p = head;for (int i = 0; i < pos 1; i++){p = p>next;}LinkNode insertHead = insertStrhead;while (insertHead) {LinkNode newNode = new LinkNode(insertHead>data);newNode>next = p>next;p>next = newNode;p = p>next;insertHead = insertHead>next;}length += insertStrlength;}void LinkString::deleteSub(int start, int len) {LinkNode p = head;for (int i = 0; i < start 1; i++){p = p>next;}LinkNode temp = p>next;for (int i = 0; i < len; i++){LinkNode delNode = temp;temp = temp>next;delete delNode;}p>next = temp;length = len;}```(三)测试用例1、顺序存储方式的测试```cppint main(){SeqString s1 = createSeqString("Hello");SeqString s2 = createSeqString("World");SeqString s3 = concatSeqString(s1, s2);std::cout <<"连接后的字符串: "<< s3str << std::endl; int cmpResult = compareSeqString(s1, s2);if (cmpResult < 0) {std::cout <<"s1 小于 s2" << std::endl;} else if (cmpResult == 0) {std::cout <<"s1 等于 s2" << std::endl;} else {std::cout <<"s1 大于 s2" << std::endl;}SeqString sub = subSeqString(s1, 1, 3);std::cout <<"子串: "<< substr << std::endl; insertSeqString(s1, 2, s2);std::cout <<"插入后的字符串: "<< s1str << std::endl; deleteSeqString(s1, 3, 2);std::cout <<"删除后的字符串: "<< s1str << std::endl; return 0;}```2、链式存储方式的测试```cppint main(){LinkString ls1("Hello");LinkString ls2("World");LinkString ls3 = ls1concat(ls2);std::cout <<"连接后的字符串: ";LinkNode p = ls3head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;int cmpResult = ls1compare(ls2);if (cmpResult < 0) {std::cout <<"ls1 小于 ls2" << std::endl;} else if (cmpResult == 0) {std::cout <<"ls1 等于 ls2" << std::endl;} else {std::cout <<"ls1 大于 ls2" << std::endl;}LinkString sub = ls1subString(1, 3);std::cout <<"子串: ";p = subhead;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;ls1insert(2, ls2);std::cout <<"插入后的字符串: ";p = ls1head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;ls1deleteSub(3, 2);std::cout <<"删除后的字符串: ";p = ls1head;while (p) {std::cout << p>data;p = p>next;}std::cout << std::endl;return 0;}```五、实验结果及分析(一)顺序存储方式1、连接操作成功实现,输出了正确连接后的字符串。

数据结构串的实验报告

数据结构串的实验报告

HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY数据结构程序设计实验报告03实训题目:串的构造与应用(自行编写)专业:软件工程班级: 软件 161 姓名:王洋学号: 201600819 完成日期: 2017年11月5日2017年11月目录一实验前提 (3)一、1. 实验序言 (3)一、2. 实验目的 (3)一、3. 实验背景 (3)一、4. 实验方式 (4)二程序原理 (4)二、1. 设计思路 (4)二、2. 实验原理 (4)三程序设计 (6)三、1. 主要功能 (6)三、2. 程序界面 (6)四功能实现 (7)四、1. 串的初始化 (7)四、2. 串的插入和删除 (8)四、3. 串的修改及提取子串 (9)四、4. 程序调试 (10)四、5. 程序细节 (10)四、6. 要点函数功能源码 (11)五 }程序总结 (12)五、1. 程序收获清单 (12)五、2. 程序不足改进 (12)六实验总结 (12)一实验前提一、1. 实验序言每一次实验都是一种历练和进步,至少在每次进行序言的时候,都会去总结和想办法改进程序。

即使能力有限,我也切身感受到了进步,以及进步后对程序的稍微深度地思考。

而这次对于串的实验,显然让我感受到了,这样的思考非常欠缺,我所需要完成的还有很多,尤其是随着功能的完善,和深入的编程,会发现其中有更多的地方需要我去改进,尤其是功能越多越深入,这种感觉就越明显一、2. 实验目的串的基本操作的编程实现(2学时,验证型),掌握串的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、合并、剪裁等操作,存储结构可以在顺序结构或链接结构、索引结构中任选,也可以全部实现。

也鼓励学生利用基本操作进行一些应用的程序设计。

一、3. 实验背景在较熟练的掌握关于对象的编程方法后,这次我就改用了C++进行编写,而且难度要比我预期的要低,效果反而更好了。

同时,串基于字符数组实现要容易得多,而且对于一维数组的具体操作,已经相对较为熟练,而且也提供了很多关于字符串的相关函数,所以为了提高编程水平,这次对于串的操作,都不依赖系统函数和字符串函数,相反,深入初始化,插入,删除,遍历等功能的本质,对字符串的底层进行编程实现。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

《数据结构》实验报告——排序

《数据结构》实验报告——排序

《数据结构》实验报告排序实验题目:输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。

实验所使用的数据结构内容及编程思路:1.插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。

一般情况下,第i趟直接插入排序的操作为:在含有i-1个记录的有序子序列r[1..i-1]中插入一个记录r[i]后,变成含有i个记录的有序子序列r[1..i];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r[0]处设置哨兵。

在自i-1起往前搜索的过程中,可以同时后移记录。

整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

2.快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

假设待排序的序列为{L.r[s],L.r[s+1],…L.r[t]},首先任意选取一个记录(通常可选第一个记录L.r[s])作为枢轴(或支点)(pivot),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。

由此可以该“枢轴”记录最后所罗的位置i作为界线,将序列{L.r[s],…,L.r[t]}分割成两个子序列{L.r[i+1],L.[i+2],…,L.r[t]}。

这个过程称为一趟快速排序,或一次划分。

一趟快速排序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴记录互相交换,重复这两不直至low=high为止。

数据结构-顺序串基本操作实验报告

数据结构-顺序串基本操作实验报告

数据结构\顺序串基本操作实验报告实验报告数据结构\顺序串基本操作一、实验目的本实验旨在通过实践,掌握顺序串的基本操作,包括顺序串的初始化、销毁、插入、删除和查找等。

二、实验内容1\初始化顺序串2\销毁顺序串3\插入元素到顺序串4\删除顺序串中的指定元素5\查找顺序串中的指定元素三、实验步骤1\初始化顺序串顺序串的初始化就是创建一个空顺序串,可以通过创建一个定长数组来实现。

具体步骤如下:(1)定义一个定长数组,例如a[MAX_SIZE],用于存储顺序串的元素。

(2)定义一个变量len,用于记录顺序串的当前长度,初值为0。

2\销毁顺序串销毁顺序串就是释放顺序串占用的内存空间,具体步骤如下:(1)释放数组a所占用的内存空间。

(2)将len重置为0。

3\插入元素到顺序串插入元素到顺序串就是在指定位置插入一个元素。

具体步骤如下:(1)判断插入位置的合法性,如果位置小于0或大于当前顺序串的长度,即为非法操作。

(2)将len加1,表示顺序串的长度增加了一个。

(3)将插入位置及其之后的元素依次后移一位。

(4)将需要插入的元素存放到插入位置处。

4\删除顺序串中的指定元素删除顺序串中的指定元素就是将顺序串中某个位置的元素删除。

具体步骤如下:(1)判断被删除位置的合法性,如果位置小于0或大于等于当前顺序串的长度,即为非法操作。

(2)将被删除位置之后的元素依次前移一位。

(3)将len减1,表示顺序串的长度减少了一个。

5\查找顺序串中的指定元素查找顺序串中的指定元素就是找出顺序串中第一个与给定元素相等的元素的位置。

具体步骤如下:(1)从顺序串的第一个元素开始逐个与给定元素比较,直到找到相等的元素或搜索到顺序串的末尾。

(2)返回相等元素的位置。

四、实验结果与分析根据实验步骤,我们可以完成顺序串的初始化、销毁、插入、删除和查找等基本操作。

通过这些操作,我们可以对顺序串进行各种元素的插入、删除和查找操作,方便实现顺序串的各种功能。

顺序栈实验报告

顺序栈实验报告

顺序栈实验报告顺序栈实验报告一、引言顺序栈是一种基本的数据结构,它具有先进先出的特点。

在本次实验中,我们将学习并实现顺序栈的基本操作,包括入栈、出栈、判空和获取栈顶元素等。

通过这次实验,我们将深入理解栈的概念和原理,并掌握如何使用顺序栈解决实际问题。

二、实验目的1. 学习顺序栈的定义和基本操作。

2. 掌握顺序栈的实现方法。

3. 理解顺序栈的应用场景。

三、实验过程1. 定义顺序栈的结构在本次实验中,我们选择使用数组来实现顺序栈。

首先,我们需要定义一个栈的结构体,包括栈的容量和栈顶指针。

2. 初始化栈在实验开始时,我们需要初始化一个空栈。

这里,我们将栈顶指针设置为-1,表示栈为空。

3. 入栈操作当我们需要将一个元素压入栈时,我们首先判断栈是否已满。

如果栈已满,则无法进行入栈操作;否则,我们将栈顶指针加1,并将元素放入栈顶位置。

4. 出栈操作当我们需要从栈中弹出一个元素时,我们首先判断栈是否为空。

如果栈为空,则无法进行出栈操作;否则,我们将栈顶指针减1,并返回栈顶元素。

5. 判空操作判断栈是否为空可以通过检查栈顶指针是否等于-1来实现。

如果栈顶指针等于-1,则表示栈为空;否则,表示栈非空。

6. 获取栈顶元素要获取栈顶元素,我们只需返回栈顶指针所指向的元素即可。

需要注意的是,此操作不会改变栈的状态。

四、实验结果通过实验,我们成功实现了顺序栈的基本操作,并进行了测试。

在测试过程中,我们发现顺序栈可以有效地存储和操作数据。

我们可以轻松地将元素入栈和出栈,并通过判断栈是否为空来避免错误操作。

同时,获取栈顶元素的操作也非常方便,可以快速获取栈中最新的数据。

五、实验总结通过本次实验,我们深入了解了顺序栈的概念和原理,并掌握了顺序栈的基本操作。

顺序栈作为一种基本的数据结构,在实际应用中具有广泛的用途。

例如,在计算机程序中,我们可以使用顺序栈来实现函数调用的堆栈,以便保存函数的返回地址和局部变量等信息。

此外,在表达式求值、括号匹配和逆波兰表达式等问题中,顺序栈也发挥着重要的作用。

数据结构实验报告排序

数据结构实验报告排序

数据结构实验报告排序数据结构实验报告:排序引言:排序是计算机科学中常见的算法问题之一,它的目标是将一组无序的数据按照特定的规则进行排列,以便于后续的查找、统计和分析。

在本次实验中,我们将学习和实现几种常见的排序算法,并对它们的性能进行比较和分析。

一、冒泡排序冒泡排序是最简单的排序算法之一,它通过不断交换相邻的元素,将较大(或较小)的元素逐渐“冒泡”到数组的一端。

具体实现时,我们可以使用两层循环来比较和交换元素,直到整个数组有序。

二、插入排序插入排序的思想是将数组分为两个部分:已排序部分和未排序部分。

每次从未排序部分中取出一个元素,插入到已排序部分的适当位置,以保持已排序部分的有序性。

插入排序的实现可以使用一层循环和适当的元素交换。

三、选择排序选择排序每次从未排序部分中选择最小(或最大)的元素,与未排序部分的第一个元素进行交换。

通过不断选择最小(或最大)的元素,将其放置到已排序部分的末尾,从而逐渐形成有序序列。

四、快速排序快速排序是一种分治的排序算法,它通过选择一个基准元素,将数组划分为两个子数组,其中一个子数组的所有元素都小于等于基准元素,另一个子数组的所有元素都大于基准元素。

然后对两个子数组分别递归地进行快速排序,最终将整个数组排序。

五、归并排序归并排序也是一种分治的排序算法,它将数组划分为多个子数组,对每个子数组进行排序,然后再将排好序的子数组合并成一个有序的数组。

归并排序的实现可以使用递归或迭代的方式。

六、性能比较与分析在本次实验中,我们对以上几种排序算法进行了实现,并通过对不同规模的随机数组进行排序,比较了它们的性能。

我们使用了计算排序时间的方式,并记录了每种算法在不同规模下的运行时间。

通过对比实验结果,我们可以得出以下结论:1. 冒泡排序和插入排序在处理小规模数据时表现较好,但在处理大规模数据时性能较差,因为它们的时间复杂度为O(n^2)。

2. 选择排序的时间复杂度也为O(n^2),与冒泡排序和插入排序相似,但相对而言,选择排序的性能稍好一些。

串-数据结构实验报告[修改版]

串-数据结构实验报告[修改版]

第一篇:串-数据结构实验报告【源程序】:#include #include #include void choose(char *s, int i,int m,char *t);//i位置截取m个字符函数void main() //主函数{ char *s,*t; int i,sl,m;s=(char *)malloc(100*sizeof(char));t=(char *)malloc(100*sizeof(char));printf("\n 输入主字符串s=?"); gets(s); printf("\n s=%s\n",s);printf("\n 输入位置i=?"); scanf("%d",&i); printf("\n i=%d\n",i);printf("\n 输入字符个数m=?"); scanf("%d",&m); printf("\n m=%d\n",m);sl=strlen(s);if(i>sl) printf("i位置出错\n");else if(i+m>sl+1) printf("m位置出错\n");else{choose(s,i,m,t);printf("\n 子串为t=%s\n",t);} } //end_main void choose(char *s, int i,int m,char *t) { int n;int j=0; for(n=i;n三.实验结论及分析串的存储结构包含有顺序存储结构和链式存储结构。

在串的顺序存储结构中,表示串的长度通常有两种方法:一种方法是设置一个串的长度参数,其优点在于便于在算法中用长度参数控制循环过程;另一种方法是在串值得末尾添加结束标记,此种方法的优点在于便于系统自动实现。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告目录1. 实验简介1.1 实验背景1.2 实验目的1.3 实验内容2. 实验方法2.1 数据结构选择2.2 算法设计2.3 程序实现3. 实验结果分析3.1 数据结构性能分析3.2 算法效率比较3.3 实验结论4. 实验总结1. 实验简介1.1 实验背景本实验是数据结构课程的一次实践性操作,旨在帮助学生加深对数据结构的理解和运用。

1.2 实验目的通过本实验,学生将学会如何选择合适的数据结构来解决特定问题,了解数据结构与算法设计的关系并能将其应用到实际问题中。

1.3 实验内容本实验将涉及对一些经典数据结构的使用,如链表、栈、队列等,并结合具体问题进行算法设计和实现。

2. 实验方法2.1 数据结构选择在实验过程中,需要根据具体问题选择合适的数据结构,比如针对需要频繁插入删除操作的情况可选择链表。

2.2 算法设计针对每个问题,需要设计相应的算法来实现功能,要考虑算法的效率和实际应用情况。

2.3 程序实现根据算法设计,编写相应的程序来实现功能,并进行调试测试确保程序能够正确运行。

3. 实验结果分析3.1 数据结构性能分析在实验过程中,可以通过对不同数据结构的使用进行性能分析,如时间复杂度和空间复杂度等,以便选择最优的数据结构。

3.2 算法效率比较实验完成后,可以对不同算法在同一数据结构下的效率进行比较分析,找出最优算法。

3.3 实验结论根据实验结果分析,得出结论并总结经验教训,为后续的数据结构和算法设计提供参考。

4. 实验总结通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能将所学知识应用到实际问题中,提高自己的实践能力和解决问题的能力。

数据结构_串的基本操作_课程设计_实验报告

数据结构_串的基本操作_课程设计_实验报告
NO3:程序设计的优缺点及遇到的问题....................................................................11 1.程序设计的优缺点...........................................................................................11 2.在程序设计的过程中遇到的问题:...............................................................11
顾名思义,串及其基本操作,就是要在理解串的基本概念和特征的基础 上,了解串的内部表示和处理方法。这样才能有效地实现串的基本操作。串,也 还是字符串,是一种特殊的线性表。特殊之处在于表中的每一个元素都是字符, 以及由此而要求的一些特殊操作。在串及其基本操作中,要求的操作有联接、求 串长、求子串、比较串的大小、串的插入、串的删除、子串的定位和置换。因为 所要进行的操作比较零散也比较多,所以就要用到多个函数把这个整体的课程设 计划分成多个模块来进行。每个函数对应一个功能。在主函数中,用一个菜单, 就可以将原来的已分模块的函数系统地进行检验及操作。在程序设计的过程中, 根据课程设计的目的和基本要求,注意一些容易出错的地方及问题。
printf("请输入两串字符串:");
scanf("%s%s",str1,str2);
if(strcmp(str1,str2)>0) printf("1");
2
循环下,输入一个数字。每个数字代表不同的功能。然后用一个 switch 语句,
不同的 case 对应不同的函数,如:case(0)就可以代表求字符串的串长。

数据结构排序实验报告

数据结构排序实验报告

数据结构排序实验报告一、实验目的本次数据结构排序实验的主要目的是深入理解和掌握常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序和归并排序,并通过实际编程和实验分析,比较它们在不同规模数据下的性能表现,从而为实际应用中选择合适的排序算法提供依据。

二、实验环境本次实验使用的编程语言为 Python 3x,开发环境为 PyCharm。

实验中使用的操作系统为 Windows 10。

三、实验原理1、冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法。

它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

2、插入排序(Insertion Sort)插入排序是一种简单直观的排序算法。

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个数组有序。

3、选择排序(Selection Sort)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

以此类推,直到所有元素均排序完毕。

4、快速排序(Quick Sort)通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

5、归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

四、实验步骤1、算法实现使用 Python 语言分别实现上述五种排序算法。

为每个算法编写独立的函数,函数输入为待排序的列表,输出为排序后的列表。

2、生成测试数据生成不同规模(例如 100、500、1000、5000、10000 个元素)的随机整数列表作为测试数据。

数据结构顺序串和链串实验报告

数据结构顺序串和链串实验报告

《数据结构》课程实验报告实验名称顺序串和链串实验序号 4 实验日期姓名院系班级学号专业指导教师成绩教师评语一、实验目的和要求(1)理解串和一般线形表之间的差异(2)重点掌握在顺序串上和链串上实现串的基本运算算法(3)掌握串的简单匹配算法和KMP算法(4)灵活运用串这种数据结构解决一些综合应用问题二、实验项目摘要编写一个程序algo4-1.cpp,实现顺序串的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)建立串s=”abcdefghefghijklmn”和串sl=”xyz”;(2)输出串s;(3)输出串s的长度;(4)在串s的第9个字符位置插入串sl而产生串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。

编写一个程序algo4-2.cpp,实现链串的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)建立串s=”abcdefghefghijklmn”和串sl=”xyz”;(2)输出串s;(3)输出串s的长度;(4)在串s的第9个字符位置插入串sl而产生串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。

三、实验预习内容顺序串的基本运算的算法(StrAssign(s,cstr),StrCopy(s,t),StrEquat(s,t),StrLength(s),Concat(s,t),SubStr (s,i,j),InsStr(s1,i,s2),DelStr(s,i,j),RepStr(s,i,j,t),DispStr(s))链串的基本运算的算法(StrAssign(s,cstr),StrCopy(s,t),StrEquat(s,t),StrLength(s),Concat(s,t),SubStr (s,i,j),InsStr(s1,i,s2),DelStr(s,i,j),RepStr(s,i,j,t),DispStr(s))三、实验结果与分析4-1#include <stdio.h>#define MaxSize 100typedef struct{ char data[MaxSize];int length;} SqString;void StrAssign(SqString &s,char cstr[]){ int i;for (i=0;cstr[i]!='\0';i++)s.data[i]=cstr[i];s.length=i;}void StrCopy(SqString &s,SqString t){ int i;for (i=0;i<t.length;i++)s.data[i]=t.data[i];s.length=t.length;}int StrEqual(SqString s,SqString t){ int same=1,i;if (s.length!=t.length)elsefor (i=0;i<s.length;i++)if (s.data[i]!=t.data[i]){ same=0;break;}return same;}int StrLength(SqString s){return s.length;}SqString Concat(SqString s,SqString t){ SqString str;int i;str.length=s.length+t.length;for (i=0;i<s.length;i++)str.data[i]=s.data[i];for (i=0;i<t.length;i++)str.data[s.length+i]=t.data[i];return str;}SqString SubStr(SqString s,int i,int j){ SqString str;int k;str.length=0;if (i<=0 || i>s.length || j<0 || i+j-1>s.length) return str;for (k=i-1;k<i+j-1;k++)str.data[k-i+1]=s.data[k];str.length=j;return str;}SqString InsStr(SqString s1,int i,SqString s2) { int j;SqString str;str.length=0;if (i<=0 || i>s1.length+1)for (j=0;j<i-1;j++)str.data[j]=s1.data[j];for (j=0;j<s2.length;j++)str.data[i+j-1]=s2.data[j];for (j=i-1;j<s1.length;j++)str.data[s2.length+j]=s1.data[j];str.length=s1.length+s2.length;return str;}SqString DelStr(SqString s,int i,int j){ int k;SqString str;str.length=0;if (i<=0 || i>s.length || i+j>s.length+1)return str;for (k=0;k<i-1;k++)str.data[k]=s.data[k];for (k=i+j-1;k<s.length;k++)str.data[k-j]=s.data[k];str.length=s.length-j;return str;}SqString RepStr(SqString s,int i,int j,SqString t) { int k;SqString str;str.length=0;if (i<=0 || i>s.length || i+j-1>s.length)return str;for (k=0;k<i-1;k++)str.data[k]=s.data[k];for (k=0;k<t.length;k++)str.data[i+k-1]=t.data[k];for (k=i+j-1;k<s.length;k++)str.data[t.length+k-j]=s.data[k];str.length=s.length-j+t.length;return str;}void DispStr(SqString s){ int i;if (s.length>0){for (i=0;i<s.length;i++)printf("%c",s.data[i]);printf("\n");}}int main(){SqString s,s1,s2,s3,s4;printf("建立串s='abcdefghefghijklmn'和串sl='xyz'\n");StrAssign(s,"abcdefghefghijklmn");StrAssign(s1,"xyz");printf("输出串s:");DispStr(s);printf("串s的长度:%d\n",StrLength(s));printf("在串s的第9个字符位置插入串sl而产生串s2\n");s2=InsStr(s,9,s1);printf("输出串s2:");DispStr(s2);printf("删除串s的第2个字符开始的5个字符而产生的串s2\n");s2=DelStr(s,2,5);printf("输出串s2:");DispStr(s2);printf("将串s的第2个字符开始的5个字符替换成串s1而产生串s2\n"); s2=RepStr(s,2,5,s1);printf("输出串s2:");DispStr(s2);printf("提取串s的第2个字符开始的10个字符而产生串s3\n");s3=SubStr(s,2,10);printf("输出串s3:");DispStr(s3);printf("将串s1和串s2连接起来而产生串s4\n");s4=Concat(s1,s2);printf("输出串s4:");DispStr(s4);}4-2#include <stdio.h>#include <malloc.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 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;elsereturn 0;}int StrLength(LiString *s){ int i=0;LiString *p=s->next;while (p!=NULL){ i++;p=p->next;}return i;}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));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;q->next=NULL;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;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;}return str;}void DispStr(LiString *s){ LiString *p=s->next;while (p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}int main(){LiString *s,*s1,*s2,*s3,*s4;printf("建立串s和串s1\n");StrAssign(s,"abcdefghefghijklmn");StrAssign(s1,"xyz");printf("输出串s:");DispStr(s);printf("串s的长度:%d\n",StrLength(s));printf("在串s的第9个字符位置插入串s1而产生串s2\n");s2=InsStr(s,9,s1);printf("输出串s2:");DispStr(s2);printf("删除串s第2个字符开始的5个字符而产生串s2\n");s2=DelStr(s,2,3);printf("输出串s2:");DispStr(s2);printf("将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");s2=RepStr(s,2,5,s1);printf("输出串s2:");DispStr(s2);printf("提取串s的第2个字符开始的10个字符而产生串s3\n");s3=SubStr(s,2,10);printf("(输出串s3:");DispStr(s3);printf("将串s1和串s2连接起来而产生串s4\n");s4=Concat(s1,s2);printf("输出串s4:");DispStr(s4);}注:空间不够,可以增加页码。

顺序栈基本操作实验报告

顺序栈基本操作实验报告

数据结构实验三课程数据结构实验名称顺序栈基本操作第页专业班级学号姓名实验日期:年月日评分一、实验目的1.熟悉并能实现栈的定义和基本操作。

2.了解和掌握栈的应用。

二、实验要求1.进行栈的基本操作时要注意栈"后进先出"的特性。

2.编写完整程序完成下面的实验内容并上机运行。

3.整理并上交实验报告。

三、实验内容1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。

2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。

主要功能描述如下:(1)从键盘上输入表达式。

(2)分析该表达式是否合法:•a) 是数字,则判断该数字的合法性。

若合法,则压入数据到堆栈中。

•b) 是规定的运算符,则根据规则进行处理。

在处理过程中,将计算该表达式的值。

•c) 若是其它字符,则返回错误信息。

(3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。

程序中应主要包含下面几个功能函数:•l void initstack():初始化堆栈•l int Make_str():语法检查并计算•l int push_operate(int operate):将操作码压入堆栈•l int push_num(double num):将操作数压入堆栈•l int procede(int operate):处理操作码•l int change_opnd(int operate):将字符型操作码转换成优先级•l int push_opnd(int operate):将操作码压入堆栈•l int pop_opnd():将操作码弹出堆栈•l int caculate(int cur_opnd):简单计算+,-,*,/•l double pop_num():弹出操作数四、实验步骤(描述实验步骤及中间的结果或现象。

在实验中做了什么事情,怎么做的,发生的现象和中间结果)第一题:#include <iostream>using namespace std;#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量#define OVERFLOW -1#define OK 1#define NO -1#define NULL 0typedef int Status;typedef char SElemType;typedef struct{SElemType *base; //在栈构造之前和销毁之后,base的值为NULLSElemType *top; //栈顶指针int stacksize; //当前已分配的存储空间,以元素为单位} SqStack;Status Initstack(SqStack &S)//构造一个空栈S{S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize= STACK_INIT_SIZE;return OK;}//InitStackStatus StackEmpty(SqStack &S){if(S.base==S.top)return OK;elsereturn NO;}Status ClearStack (SqStack &S)//把S置为空{if(S.base=S.top);return OK;}Status DsetroyStack (SqStack &S)//销毁栈S{S.base=NULL;return OK;}Status Push(SqStack &S,SElemType e)//插入元素e为新的栈顶元素{if (S.top-S.base>=S.stacksize){S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base) //存储分配失败exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}//PushStatus Pop(SqStack &S,SElemType &c)//若栈不空,则删除S的栈顶元素,用c返回其值,并返回OK;否则返回ERROR {if(S.top==S.base)return NO;c=*--S.top;return OK;}//PopStatus GetTop(SqStack &S,SElemType &e){if (S.top==S.base)return NO;e=*(S.top-1);return OK;}//GetTopint main(){SqStack S;Initstack(S);cout<<"输入要压到栈中的元素!"<<endl;char c;while((c=getchar())!='\n'){Push(S,c);}GetTop(S,c);cout<<"栈顶元素为:"<<c<<endl;//ClearStack (S);//DsetroyStack(S);for(int i=0;S.top!=S.base;i++){Pop(S,c);cout<<"栈中第"<<i+1<<"元素的值:";cout<<c<<endl;}return 0;}第二题:#include<iostream>using namespace std;#define STACK_SIZE 100#define STACKINCREMENT 10#define OVERFLOW -1#define OK 1#define NO 0typedef int Status;typedef char SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int main(){char GetTop(SqStack &s);Status Initstack(SqStack &s);Status push_operate(SqStack &s,SElemType e);Status push_num(SqStack &s,int e);Status Stackempty(SqStack &s);Status pop_num(SqStack &s,int &c);Status pushoperate(SElemType operate);Status pushnum(SElemType num);Status caculate(SElemType a,SElemType operate,SElemType b);Status pop_operate(SqStack &s,SElemType &c);Status change(SElemType e);char Precede(SElemType a,SElemType b);char Operatecxz();int m;m=Operatecxz();cout<<m<<endl;return 0;}Status change(SElemType e){int m;m=e-48;return m;}Status Initstack(SqStack &s){s.base=(SElemType *)malloc(STACK_SIZE*sizeof(SElemType));if(!s.base)exit(OVERFLOW);s.top=s.base;s.stacksize=STACK_SIZE;return OK;}Status Stackempty(SqStack &s){if(s.base==s.top)return OK;elsereturn NO;}Status push_num(SqStack &s,int e){if(s.top-s.base>=s.stacksize){s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!s.base)exit(OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;return OK;}Status push_operate(SqStack &s,SElemType e){if(s.top-s.base>=s.stacksize){s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!s.base)exit(OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;return OK;}Status pop_operate(SqStack &s,SElemType &c){if(s.top==s.base)return NO;c=*--s.top;return OK;}Status pop_num(SqStack &s,int &c){if(s.top==s.base)return NO;c=*--s.top;return OK;}char GetTop(SqStack &s){char c;if(s.top==s.base)return NO;c=*(s.top-1);return c;}Status caculate(int a,SElemType operate,int b){int s;if(operate=='+')s=a+b;if(operate=='-')s=a-b;if(operate=='*')s=a*b;if(operate=='/')s=a/b;return s;}Status In(SElemType c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')') return OK;if(c>='0'&&c<='9')return NO;return -1;}char Precede(SElemType a,SElemType b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='#')return '>';if(b=='*'||b=='/'||b=='(')return '<';}if(a=='*'||a=='/'){if(b=='+'||b=='-'||b==')'||b=='*'||b=='/'||b=='#')return '>';if(b=='(')return '<';}if(a=='('){if(b==')')return '=';if(b=='+'||b=='-'||b=='*'||b=='/')return '<';if(b=='#')return ' ';}if(a==')'){if(b==')')return ' ';if(b=='+'||b=='-'||b=='*'||b=='/'||b=='('||b=='#')return '>';}if(a=='#'){if(b=='#')return '=';if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')return '<';if(b==')')return ' ';}return ' ';}char Operatecxz(){SqStack Operate,Num;char c,e,x;int num,a,b,flat=1,sz=0;Initstack(Operate);push_operate(Operate,'#');Initstack(Num);c=getchar();while(c!='#'||GetTop(Operate)!='#'){if(In(c)==-1){cout<<"input error!"<<endl;flat=0;break;}if(In(c)!=1){if(sz==0){num=change(c);sz=1;c=getchar();continue;}if(sz==1)num=num*10+change(c);c=getchar();continue;}else{if(sz==1)push_num(Num,num);sz=0;x=GetTop(Operate);switch(Precede(GetTop(Operate),c)){case '<':{push_operate(Operate,c);c=getchar();break;}case '=':{pop_operate(Operate,e);c=getchar();break;}case '>':{pop_num(Num,a);pop_operate(Operate,e);pop_num(Num,b);push_num(Num,caculate(b,e,a));break;}}}}pop_operate(Operate,e);if(e!='#')flat=0;if(flat==1){pop_num(Num,a);return a;}if(flat==0)return 0;}五.实验结果与讨论(描述最终得到的结果,并进行分析说明,可能的误差原因)第一题:1 把主函数中的ClearStack (S);DsetroyStack(S)注释掉的结果:2 不把ClearStack (S)注释掉,把栈清空:3 不把DsetroyStack(S)注释掉,即销毁栈:出现一堆乱码,说明销毁成功。

数据结构排序实验报告

数据结构排序实验报告

数据结构排序实验报告
数据结构排序实验报告是指对数据结构中的排序算法进行实验,测试其时间复杂度、空间复杂度、稳定性等特性,最终根据实验结果分析出各种排序算法在不同实际情况下的优劣势,从而为选择排序算法提供参考。

一般来说,数据结构排序实验报告包括以下几个部分:
第一部分:实验目的和要求,明确实验目的,并给出实验要求,如实验的数据大小、算法的输入形式等;
第二部分:实验方法,描述实验所使用的算法,以及实验所采用的方法;
第三部分:实验结果,将实验的结果清晰地表示出来,包括每种排序算法的时间复杂度、空间复杂度和稳定性;
第四部分:实验总结,对实验结果进行比较和分析,以得出各种排序算法在不同实际情况下的优劣势,为最终给出排序算法的推荐提供依据。

顺序串的实验报告

顺序串的实验报告

一、实验目的1. 理解顺序串的概念及其特点;2. 掌握顺序串的创建、操作和遍历方法;3. 熟悉顺序串在编程中的应用。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 创建顺序串2. 操作顺序串3. 遍历顺序串4. 应用顺序串四、实验步骤1. 创建顺序串```javaimport java.util.Scanner;public class SequenceString {public static void main(String[] args) {Scanner scanner = new Scanner(System.in); System.out.println("请输入字符串:");String input = scanner.nextLine();String sequenceString = new String(input);System.out.println("创建顺序串成功!");}}```2. 操作顺序串```javaimport java.util.Scanner;public class SequenceString {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入字符串:");String input = scanner.nextLine();String sequenceString = new String(input);// 判断字符串是否为空if (sequenceString.isEmpty()) {System.out.println("字符串为空!");} else {// 判断字符串是否为空串if (sequenceString.equals("")) {System.out.println("字符串为空串!"); } else {// 判断字符串是否为空格if (sequenceString.trim().isEmpty()) {System.out.println("字符串为空格!");} else {// 获取字符串长度int length = sequenceString.length();System.out.println("字符串长度为:" + length); }}}}}```3. 遍历顺序串```javaimport java.util.Scanner;public class SequenceString {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入字符串:");String input = scanner.nextLine();String sequenceString = new String(input);// 遍历字符串for (int i = 0; i < sequenceString.length(); i++) {char c = sequenceString.charAt(i);System.out.println("字符 " + (i + 1) + ":" + c);}}}```4. 应用顺序串```javaimport java.util.Scanner;public class SequenceString {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入字符串:");String input = scanner.nextLine();String sequenceString = new String(input);// 查找字符串中指定字符的位置int index = sequenceString.indexOf('a');if (index != -1) {System.out.println("字符 'a' 的位置:" + index);} else {System.out.println("字符 'a' 不在字符串中!");}// 替换字符串中的指定字符String replacedString = sequenceString.replace('a', 'b');System.out.println("替换后的字符串:" + replacedString);}}```五、实验结果与分析1. 创建顺序串成功;2. 判断字符串为空、空串和空格;3. 获取字符串长度;4. 遍历字符串,打印每个字符;5. 查找字符串中指定字符的位置;6. 替换字符串中的指定字符。

数据结构实验报告串

数据结构实验报告串

一、实验目的1. 理解串的概念和性质;2. 掌握串的基本操作,如连接、赋值、求长度、定位等;3. 熟悉串的两种存储结构:顺序存储和链式存储;4. 能够实现串的简单应用,如字符串匹配、子串查找等。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 串的定义和性质2. 串的顺序存储结构3. 串的链式存储结构4. 串的基本操作5. 字符串匹配算法6. 子串查找算法四、实验步骤1. 定义串的数据结构```cpp#define MAX_SIZE 100typedef struct {char data[MAX_SIZE];int length;} StrString;```2. 实现串的基本操作```cpp// 初始化串void InitString(StrString &S) {S.length = 0;}// 赋值操作void AssignString(StrString &S, StrString T) { for (int i = 0; i < T.length; i++) {S.data[i] = T.data[i];}S.length = T.length;}// 求长度操作int Length(StrString S) {return S.length;}// 定位操作int Index(StrString S, StrString T, int pos) { int i, j;i = pos;for (j = 0; j < T.length && i < S.length; j++, i++) { if (S.data[i] != T.data[j]) {i = i - j;j = 0;}}if (j == T.length) {return i - T.length + 1;}return 0;}```3. 实现字符串匹配算法```cpp// 字符串匹配算法(KMP算法)int KMPMatch(StrString S, StrString T) {int i, j;int next[T.length];// 构建next数组for (i = 1, j = 0; i < T.length; i++) {while (j > 0 && T.data[i] != T.data[j]) {j = next[j - 1];}if (T.data[i] == T.data[j]) {j++;}next[i] = j;}// 匹配过程i = 0;j = 0;while (i < S.length && j < T.length) { if (S.data[i] == T.data[j]) {i++;j++;} else if (j > 0) {j = next[j - 1];} else {i++;}}if (j == T.length) {return i - j;}return 0;}```4. 实现子串查找算法```cpp// 子串查找算法(朴素算法)int SubStringMatch(StrString S, StrString T) {int i, j;for (i = 0; i <= S.length - T.length; i++) {j = 0;while (j < T.length && S.data[i + j] == T.data[j]) {j++;}if (j == T.length) {return i;}}return 0;}```五、实验结果与分析1. 初始化串、赋值操作、求长度操作、定位操作均能正常执行,符合预期。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告课程数据结构_ 实验名称顺序串基本操作院系电信学院专业班级计科10-4学号一、实验目的1)熟悉串的定义和串的基本操作。

2)掌握顺序串的基本运算。

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

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

本次实验共计2学时。

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

具体如下:编写串的基本操作函数顺序串类型定义如下所示:typedef struct {char ch[MAX];int length;} SeqString;(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)为空返回1,不为空返回0编写主函数调用上述函数实现下列操作:(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的第2个字符开始的10个字符而产生串s5,并输出s5(7)将串s1和串t连接起来而产生串s4,并输出s4(8)比较串s1和s5是否相等,输出结果(9)判断s3是否为空四、源程序代码#include<stdio.h>#define MAX 100typedef struct{char ch[MAX];int length;} SqString;void StrAssign(SqString &s,char t[]) //串赋值{int i;for(i=0;t[i]!='\0';i++)s.ch[i]=t[i];s.length=i;}void StrCopy(SqString &s,SqString t) //串复制{int i;for(i=0;i<t.length;i++)s.ch[i]=t.ch[i];s.length=t.length;}int StrEqual(SqString s,SqString t) //判断串相等{int same=1,i;if(s.length!=t.length){same=0;}else{for(i=0;i<s.length;i++)if(s.ch[i]!=t.ch[i]){same=0;break;}}return(same);}int StrLength(SqString s) //计算串长度{return(s.length);}SqString Concat(SqString s,SqString t) //串连接{SqString str;int i;str.length=s.length+t.length;for(i=0;i<s.length;i++)str.ch[i]=s.ch[i];for(i=0;i<t.length;i++)str.ch[s.length+i]=t.ch[i];return str;}SqString SubStr(SqString s,int i,int j)//求子串{SqString str;int k;str.length=0;if(i<=0||i>s.length||j<0||i+j-1>s.length)return str;for(k=i-1;k<i+j-1;k++)str.ch[k-i+1]=s.ch[k];str.length=j;return str;}SqString InsStr(SqString s1,int i,SqString s2) //插入{int j;SqString str;str.length=0;if(i<=0||i>s1.length+1)return str;for(j=0;j<i-1;j++)str.ch[j]=s1.ch[j];for(j=0;j<s2.length;j++)str.ch[i+j-1]=s2.ch[j];for(j=i-1;j<s1.length;j++)str.ch[s2.length+j]=s1.ch[j];str.length=s1.length+s2.length;return str;}SqString DelStr(SqString s,int i,int j) //删除{int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j>s.length+1)return str;for(k=0;k<i-1;k++)str.ch[k]=s.ch[k];for(k=i+j-1;k<s.length;k++)str.ch[k-j]=s.ch[k];str.length=s.length-j;return str;}SqString RepStr(SqString s,int i,int j,SqString t) //替换{int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j-1>s.length)return str;for(k=0;k<i-1;k++)str.ch[k]=s.ch[k];for(k=0;k<t.length;k++)str.ch[i+k-1]=t.ch[k];for(k=i+j-1;k<s.length;k++)str.ch[t.length+k-j]=s.ch[k];str.length=s.length-j+t.length;return str;}void DispStr(SqString s) //输出串所有元素{int i;if(s.length>0){for(i=0;i<s.length;i++)printf("%c",s.ch[i]);printf("\n");}}int IsEmpty(SqString s) //判断串是否为空{if(s.length>0)return 0; //不为空elsereturn 1; //为空}int main(void){void StrAssign(SqString &s,char t[]);//串赋值void StrCopy(SqString &s,SqString t);//串复制int StrEqual(SqString s,SqString t);//判断串相等int StrLength(SqString s);//计算串长度SqString Concat(SqString s,SqString t);//串连接SqString SubStr(SqString s,int i,int j);//求子串SqString InsStr(SqString s1,int i,SqString s2);//插入SqString DelStr(SqString s,int i,int j);//删除SqString RepStr(SqString s,int i,int j,SqString t);//替换void DispStr(SqString s);//输出串所有元素int IsEmpty(SqString s);//判断串是否为空char ch1[]="abcdefghijklmn",ch2[]="xyz",ch3[]="hijk";SqString s,s1,s2,s3,s4,s5,s6,t,t1,t2;int longth,same,kong;StrAssign(s,ch1); //建立串s="abcdefghijklmn"StrAssign(s1,ch2); //建立串s1="xyz"StrAssign(t,ch3); //建立串t="hijk"StrCopy(t1,t); //将串t复制给t1printf("串t1: ");DispStr(t1);longth=StrLength(t1); //求串t1的长度printf("串t1的长度为:%d\n",longth);printf("串s: ");DispStr(s);s2=InsStr(s,9,s1); //将串s1插入串s的第9个位置,得串s2printf("串s2:");DispStr(s2); //输出串s2s3=DelStr(s,2,5); //删除s第2个字符开始的5个字符而产生串s3,并输出s3 printf("串s3:");DispStr(s3); //输出串s3s4=RepStr(s,2,5,s1); //用串s1替换串s中从第2个字符起连续5个字符得到新串s4 printf("串s4:");DispStr(s4); //输出串s4s5=SubStr(s,2,10); //提取串s中第2个字符开始的10个字符而产生串s5printf("串s5:");DispStr(s5); //输出串s5s6=Concat(s1,t); //连接串s1和t而产生串s6printf("串s6:");DispStr(s6); //输出串s6same=StrEqual(s1,s5); //判断s1、s5是否相等if(same==1)printf("串s1、s5相等!");elseprintf("串s1、s5不相等!");kong=IsEmpty(s3); //判断s3是否为空if(kong==1)printf("\n串s3为空!");elseprintf("\n串s3不为空!\n");}。

相关文档
最新文档