数据结构--06字符串的基本操作

合集下载

实验三串基本操作的编程实现

实验三串基本操作的编程实现

实验三串基本操作的编程实现引言:串是由零个或多个字符组成的有限序列,是一种非常基础也非常重要的数据结构。

在本实验中,我们将学习串的基本操作,并使用C语言来实现这些操作。

1.实验目的:-掌握串的基本操作,包括串的初始化、判空、求长度、复制和拼接等操作;-学会使用C语言编程实现串的基本操作。

2.实验内容:本实验主要包括以下几个串的基本操作的编程实现。

2.1串的初始化操作在C语言中,我们可以使用字符数组来表示一个串。

以下是一个串的初始化操作的实现代码:```c#include <stdio.h>void InitString(char s[], char str[])int i;for (i = 0; str[i] != '\0'; i++)s[i] = str[i];}s[i]='\0';int maichar s[20];char str[] = "Hello, World!";InitString(s, str);printf("Initialized string: %s\n", s);return 0;```2.2串的判空操作判空操作即判断一个串是否为空串。

如果一个串的长度为0,则表示该串为空串。

以下是一个判空操作的实现代码示例:```c#include <stdio.h>#include <stdbool.h>bool IsEmptyString(char s[])return s[0] == '\0';int maichar s[20] = ""; // 空串if (IsEmptyString(s))printf("The string is empty.\n");} elseprintf("The string is not empty.\n");}return 0;```2.3串的长度操作求串的长度,即求一个串中字符的个数。

数据结构试题06(有答案)

数据结构试题06(有答案)

数据结构试题06(有答案)⼀、单选题(每题 2 分,共20分)1. 以下数据结构中哪⼀个是线性结构?( )A. 有向图B. 队列C. 线索⼆叉树D. B 树2. 在⼀个单链表HL 中,若要在当前由指针p 指向的结点后⾯插⼊⼀个由q 指向的结点,则执⾏如下( )语句序列。

A. p=q; p->next=q;B. p->next=q; q->next=p;C. p->next=q->next; p=q;D. q->next=p->next; p->next=q;3. 以下哪⼀个不是队列的基本运算?()A. 在队列第i 个元素之后插⼊⼀个元素B. 从队头删除⼀个元素C. 判断⼀个队列是否为空D.读取队头元素的值4. 字符A 、B 、C 依次进⼊⼀个栈,按出栈的先后顺序组成不同的字符串,⾄多可以组成( )个不同的字符串?A.14B.5C.6D.85. 由权值分别为3,8,6,2的叶⼦⽣成⼀棵哈夫曼树,它的带权路径长度为( )。

A . 11 B.35 C. 19 D. 53以下6-8题基于图1。

6. 该⼆叉树结点的前序遍历的序列为( )。

A. E 、G 、F 、A 、C 、D 、BB. E 、A 、G 、C 、F 、B 、DC. E 、A 、C 、B 、D 、G 、FD. E 、G 、A 、C 、D 、F 、B7. 该⼆叉树结点的中序遍历的序列为( )。

A. A 、B 、C 、D 、E 、G 、FB. E 、A 、G 、C 、F 、B 、DC. E 、A 、C 、B 、D 、G 、FE. B 、D 、C 、A 、F 、G 、E8. 该⼆叉树的按层遍历的序列为( )。

A .E 、G 、F 、A 、C 、D 、B B. E 、A 、C 、B 、D 、G 、FC. E 、A 、G 、C 、F 、B 、DD. E 、G 、A 、C 、D 、F 、B9. 下⾯关于图的存储的叙述中正确的是( )。

c语言描述-串的基本操作

c语言描述-串的基本操作

c语⾔描述-串的基本操作串的定长顺序存储(部分代码)连接两个串:串的第⼀个空间存储串长#define MIXSIZE 100typedef int Status;typedef char SString[MIXSIZE+1];Status Concat(SString *s3,SString s1,SString s2){if(s1[0]+s2[0]<=MIXSIZE){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1;i<s1[0]+s2[0];i++){*s3[i]=s2[0];}*s3[0]=s1[0]+s2[0];return TRUE;}else if(s1[0]<MIXSIZE&&(s1[0]+s2[0]>MIXSIZE)){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1,j=1;(void)(i<=MIXSIZE),j<=MIXSIZE-s1[0];j++,i++){*s3[i]=s2[j];}*s3[0]=MIXSIZE;return FALSE;}else{for(int i=1;i<=MIXSIZE;i++){*s3[i]=s1[i];}*s3[0]=MIXSIZE;return FALSE;}}求⼦串:void SubString(SString *s3,SString s1,int pos,int len){if(pos<1||len>s1[0]||len<0||len>s1[0]-pos+1)printf("⾮法操作!\n");for(int i=1,j=pos;(void)(i<len),j<pos+len-1;i++,j++){*s3[i]=s1[j];}*s3[0]=len;}串的堆分配存储表⽰#include<stdio.h>#include <stdlib.h>#include<string.h>typedef struct{char *ch;int length;}HString;//将字符串chars复制到字符串T中void StrAssign(HString *T,char *chars){int len = 0;while(*(chars+len)!='\0') //计算串的长度{len++;}if(len==0) //串chars为空的情况{T->ch=NULL;T->length=0;}else{T->ch=(char *)malloc(len * sizeof(char));for(int i=0;i<len;i++){T->ch[i]=*(chars+i);}T->length=len;}}//打印串T元素void Print_str(HString *T ){int i=0;while(i<T->length){printf("%c",T->ch[i++]);}printf("\n");}//返回串长度int StrLength(HString *T){return T->length;}//⽐较两串int StrCompare(HString *T,HString *S ){int i;if(T->length!=S->length){if(T->length>S->length){printf("字符串不等,s1的长度⼤于s2\n");return 1;}else{printf("字符串不等,s1的长度⼩于s2\n");return -1;}}else{for(i=0;i<T->length;i++){if(T->ch[i]>S->ch[i]){printf("长度相等,但s1>s2\n");return 1;}else if(T->ch[i]<S->ch[i]){printf("长度相等,但s1>s2\n");return -1;}}printf("字符串相等\n");return 0;}}//连接两的字符串void Concat(HString *T,HString *s1,HString *s2){T->ch=(char *)malloc((s1->length+s2->length)*sizeof(char)); if(!T->ch)exit(0);for(int i=0;i<s1->length;i++)T->ch[i]=s1->ch[i];}for(int i=s1->length,j=0;i<s1->length+s2->length;i++,j++) {T->ch[i]=s2->ch[j];}T->length=s1->length+s2->length;}//求⼦串void SubString(HString *T,HString *S,int pos,int len){T->ch=(char *)malloc(len*sizeof(char));if(!T->ch)exit(0);for(int i=pos-1,j=0;i<pos+len;i++,j++){T->ch[j]=S->ch[i];}T->length=len;}//清空串void ClearString(HString *T ){if(T->ch){free(T->ch);T->ch=NULL;}T->length=0;}//主函数,可对函数进⾏测试int main(){char s1[100];char s2[100];printf(" 请输⼊字符串s1:\n");gets(s1);printf("请输⼊字符串s2:\n");gets(s2);HString S,S1,S2,*p,*p1,*p2;p=&S; p1=&S1; p2=&S2;StrAssign(p1, s1);//StrAssign(p2, s2);//StrCompare(p1, p2);//Concat(p, p1, p2);//SubString(p, p1, 2, 4);//Print_str(p1);//ClearString(p1);//Print_str(p1);}串的模式匹配算法1、传统算法int Index(HString *T,HString *S, int pos){int j=0;while(pos<T->length&&j<S->length){if(T->ch[pos]==S->ch[j]){pos++;j++;}else{pos=pos-j+2;j=1;}}if(j>=S->length){int len;len=pos-S->length+1;printf("%d",len);return len;}else{return 0;}。

(2024年)《数据结构》全套课件

(2024年)《数据结构》全套课件

30
树形数据结构的查找算法
二叉排序树的查找
从根节点开始,若查找值小于当前节点 值,则在左子树中查找;若大于当前节 点值,则在右子树中查找。
VS
平衡二叉树的查找
在保持二叉排序树特性的基础上,通过旋 转操作使树保持平衡,提高查找效率。
2024/3/26
31
散列表的查找算法
散列函数的设计
将关键字映射为散列表中位置的函数。
过指针来表示。
链式存储的特点
逻辑上相邻的元素在物理位置上 不一定相邻;每个元素都包含数
据域和指针域。
链式存储的优缺点
优点是插入和删除操作不需要移 动元素,只需修改指针;缺点是
存储密度小、空间利用率低。
2024/3/26
11
线性表的基本操作与实现
插入元素
在线性表的指定位 置插入一个元素。
查找元素
在线性表中查找指 定元素并返回其位 置。
自然语言处理的应用
在自然语言处理中,需要处理大量的文本数据,数据结构中的字符 串、链表、树等可以很好地支持文本的处理和分析。
41
数据结构在计算机网络中的应用
2024/3/26
路由算法的实现
计算机网络中的路由算法需要大量的数据结构支持,如最短路径 树、距离向量等。
网络流量的控制
在计算机网络中,需要对网络流量进行控制和管理,数据结构中的 队列、缓冲区等可以很好地支持流量的控制。
37
06
数据结构的应用与拓展
2024/3/26
38
数据结构在算法设计中的应用
01
作为算法设计的基 础
数据结构为算法提供了基本操作 和存储方式,是算法实现的重要 基础。
02
提高算法效率

串操作指令

串操作指令
DI
23 D0 05 AB 92
Source
NEXT: LODSB INC AL 4、保存运算结果 5、所有操作完成否?若完成, 结束;否则继续2-4的动作 STOSB DEC CX JNZ NEXT HLT
24 D1 06 AC
Dest
DI
23 D0 05
Dest
ES
例1-2:与 REP 指令配合传送100个数。 LEA SI,Souce LEA DI,Dest MOV CX,100 LEA SI,Souce LEA DI,Dest MOV CX,100 CLD REP MOVSB HLT CX不为 0 时重复执行
SI
23 D0 05 AB 92
SI
23 D0 05 AB 92
Source
[SI] - [DI] SI+1 → SI DI+1 → DI
3、操作结束? 若否,继续2中 的操作;否则结 束程序
DI
23 D0 05 A1 92
Dest
例2-2:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同。( 与 REPE / REPZ配合使用,找第一个不相同的数据位置)
REPNE CMPSB
JE Found MOV AX, 0 JMP Exit Found : DEC SI MOV AX, SI Exit: HLT
DI 23 D0 05 A1 92 Dest
3、SCAS指令 格式:SCASB/SCASW 功能:AL/AX-[ES:DI] DI±1或2 注意:状态位随运算结果变化。
LEA DI, DEST
MOV CX, 30 MOV AL, ‘A’
DI 53 71 41 49 68 DEST

C语言~所有的字符串操作函数

C语言~所有的字符串操作函数
strcpy(string, str1); printf("%s\n", string); return 0; }
7.函数名: strcspn 功 能: 在串中查找第一个给定字符集内容的段 用 法: int strcspn(char *str1, char *str2); 程序例: #i nclude <stdio.h> #i nclude <string.h> #i nclude <alloc.h> int main(void) { char *string1 = "1234567890"; char *string2 = "747DC8"; int length;
printf("buffer 2 is greater than buffer 1\n"); if (ptr < 0)
printf("buffer 2 is less than buffer 1\n"); if (ptr == 0)
printf("buffer 2 equals buffer 1\n"); return 0; }
printf("buffer 2 is less than buffer 1\n"); if (ptr == 0)
printf("buffer 2 equals buffer 1\n"); return 0; }
14.函数名: strncpy 功 能: 串拷贝 用 法: char *strncpy(char *destin, char *source, int maxlen); 程序例: #i nclude <stdio.h> #i nclude <string.h> int main(void) {

8种C语言基本常用的字符串处理函数

8种C语言基本常用的字符串处理函数

8种C语言基本常用的字符串处理函数8种C语言基本常用的字符串处理函数本文是店铺搜索整理的8种基本的常用的字符串处理函数,所有的C语言编译系统中一般都提供这些函数,以下是店铺为大家整理的8种C语言基本常用的字符串处理函数,仅供参考,希望能够帮助到大家。

1、puts函数——输出字符串的函数一般的形式为puts(字符串组)作用:将一个字符串输出到终端。

如,char一个string,并赋予初值。

调用puts(string);进行字符串的输出。

2、gets函数——输入字符串的函数一般的形式:gets(字符数组)作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址。

gets(str);键盘输入,,,,你懂得。

注意:puts和gets函数只能输出或者输入一个字符串。

3、strcat函数——字符串连接函数一般的形式:strcat(字符数组1,字符数组2);作用:把两个字符串数组中字符串连接起来,把字符串2连接到字符串1的后面。

说明:字符数组1必须足够大,以便容纳连接后的新字符串。

4、strcpy/strncpy函数——字符串复制函数一般形式:strcpy(字符数组1,字符串2);作用:将字符串2复制到字符数组1中去。

如:char str1[10],str2[]="DongTeng";strcpy(str1,str2);执行后的结果为:你懂得注意:1. 不能用赋值语句直接将一个字符串常量或者字符数组直接给一个字符数组。

2. 用strncpy可以赋值指定的位置的字符。

strncpy(str1,str2,3);将str2中的第3个字符复制到str1中。

5、strcmp函数——字符串比较函数一般形式:strcmp(字符串1,字符串2);作用:用来比较两个字符串的差异。

具有不同的比较规则。

6、strlen函数——测字符串长度的函数一般形式:strlen(字符数组);如:char str[10]="DongTeng";printf("%d",strlen(str));得到的结果是:57、strlwr函数——转换为小写的函数一般形式:strlwr(字符串);8、strupr函数——转换为大写的函数一般形式:strupr(字符串)。

串的基本操作

串的基本操作

StSs 莎匣的唯个宇符,長度歹Go ocl bye TGood LucJkf ■■石:■ 串七为:Cond bye f hyp f Cnnrl lurk! 三己符咅”串七为=b^ef b^ef Good luck!串的基本操作一、 实验目的、意义(1) 理解串的堆分配存储结构。

(2) 理解用它们表示时插入,生成串,联接串与求子串的算法。

(3) 根据具体问题的需要,能够设计出相关算法。

二、 实验内容及要求说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输 入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修 改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

具体要求:定义串的堆分配存储,完成串的基本操作:插入,生成串,联接串,求子串三、实验所涉及的知识点C 语言算法、循环算法、串的堆分配存储结构、插入,生成串,联接 串与求子串的算法。

四、实验结果及分析(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图 方式给出。

) "E 儿敛為洁也试強Qe b extl. eweSt^): God b9E*串主否?旅“空0:5>邑七为:□峥单岬和孤相司的子早用串s 代替后,串如Good b^ef Good Luckf 舉皿青年后J 赴 宅s 为从岀屮的第I 复制吕七为串:God huefGod luch?Ss 7J i Cud luck?五、总结与体会(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。

)调试程序时,出现了许多错误。

如:串的堆分配存储结构、串的联接等。

另外还有一些语法上的错误。

由于对所学知识点概念模糊,试验课上未能完成此次上机作业。

后来经过查阅教材,浏览网页等方式,才完成试验。

这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。

以后要都去练习、实践,以完善自己的不足。

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

《数据结构》实验报告院系光电与信息工程学院专业电子信息工程姓名学号电话2011级2班2013年4月22日1.实验题目实验6. 字符串的基本操作2.需求分析(1)字符串匹配。

采用顺序结构存储串,编写一个函数SubStr(str1,str2),用于判定str2是否是str1的子串。

(2)公共字符串。

问题描述编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数。

实现要求输出非空最长公共子串的长度和最长公共子串的个数。

字符串匹配:①串长度Strlen(SString str)②判断是否为子串SubStr(SString str1,SString str2)公共字符串:①串长度Strlen(SString str)②最大公共串长度函数maxlen()③求公共串个数函数SubStrnum()输入形式:字符串。

3.概要设计(1)ADT SString{数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}结构关系:R={<a i,a i+1>|a i,a i+1 ∈D}基本操作:Strlen(SString str)操作前提:字符串str已存在操作结果:求str的长度SubStr(SString str1,SString str2)操作前提:字符串str已存在操作结果:判断str2是不是str1的子串}ADT SString{数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}基本操作:Strlen(SString str)操作前提:字符串str已存在操作结果:求str的长度maxlen(SString str1,SString str2,SString str)操作前提:字符串str1,str2,str已存在操作结果:求str1和str2的最大公共子串长度,并将该子串赋给strSubStrnum(SString str1,SString str2)操作前提:字符串str1,str2已存在操作结果:求在str1中str2子串的个数}(2)字符串匹配:本程序包含3个函数:•主函数main()•求串长函数Strlen(SString str)•{字符串匹配函数SubStr(SString str1,SString str2)各函数调用关系:主函数main调用其他两个函数公共字符串:本程序包含4个函数:•主函数main()•求串长函数Strlen(SString str)•最大公共串长度函数maxlen()•求公共串个数函数SubStrnum()各函数调用关系:主函数main调用其他三个函数(3)字符串匹配:主函数的伪码main(){定义SString 变量str1,str2;输入第一个字符串;输入第二个字符串;调用字符串匹配函数;输出匹配结果;}公共字符串:主函数的伪码main(){定义SString 变量str1,str2,str3;输入第一个字符串;输入第二个字符串;调用最大公共串长度函数,输出结果;调用公共串个数函数,输出结果;}4.详细设计字符串匹配:(1)类型定义typedef unsigned char SString[MAXSTRLEN+1];基本操作的伪码算法(1)求串长int Strlen(SString str){ 定义整型变量i;当str[i]不为空时{i++;}}(2)字符串匹配int SubStr(SString str1,SString str2){定义int变量i,m,j,p;n=Strlen(str1);m=Strlen(str2);如果n<m则返回0;当i<=n-1&&j<=m-1{如果str1[i]==str2[j]{i++;j++;}否则{i=i-j+1;j=0;}}如果j==m则返回1;否则返回0;}公共字符串:类型定义typedef unsigned char SString[MAXSTRLEN+1];基本操作的伪码算法(1)求串长int Strlen(SString str){ 定义整型变量i;当str[i]不为空时{i++;}}(2)最大公共串长度int maxlen(SString str1,SString str2,SString str){ for循环(max=Strlen(str2);max>=0;max--){For循环(i=0; str1[i]; i++)For循环(j=0; str2[j]; j++){For循环(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);如果(h==max){index = j;For循环(i=0; i<max; i++){str[i] = str2[index++];}str[max]='\0';返回max;}}}}(3)求公共串个数int SubStrnum(SString str1,SString str2) {定义变量int i=0,j=0,n,m,k=0;n=Strlen(str1);m=Strlen(str2);当str1[i]不为空时{当str2[j] 不为空时{如果str1[i]==str2[j] 则{i++;j++;}否则{i=i-j+1;j=0;}如果str1[i]为空{则退出循环;}}如果str2[j]为空{k++;j=0;}}返回k;}5.调试分析调试时出现错误,经过检查发现在某些地方出现死循环问题。

6.使用说明(1)字符串匹配:程序执行过程如下:提示用户输入第一个字符串;用户按要求输入一个字符串;提示用户输入第二个字符串;用户按要求输入二个字符串;调用字符串匹配函数,并在屏幕上显示匹配结果。

(2)公共字符串:程序执行过程如下:提示用户输入第一个字符串;用户按要求输入一个字符串;提示用户输入第二个字符串;用户按要求输入二个字符串;调用maxlen函数,并在屏幕上显示最大公共子串长度。

再调用SubStrnum函数分别进行比较,并将结果输出。

7.测试结果字符串匹配:(1)屏幕显示:请输入第一个字符串:输入abcdefghi后,屏幕显示:请输入第二个字符串:输入def后,屏幕显示:str2是str1的子串。

(2)屏幕显示:请输入第一个字符串:输入abcdefghi后,屏幕显示:请输入第二个字符串:输入cba后,屏幕显示:str2不是str1的子串。

公共字符串:屏幕显示:请输入第一个字符串:输入abcdefghijklmn后,屏幕显示:请输入第二个字符串:输入abikabnmabw后,屏幕显示:最大公共子串长度为2公共子串个数为38. 参考文献数据结构(c语言版)9.附录源程序文件如下:字符串匹配:#include<stdio.h>#define MAXSTRLEN 255typedef unsigned char SString[MAXSTRLEN+1];int Strlen(SString str){int i=0;while(str[i]!='\0'){i++;}return i;}int SubStr(SString str1,SString str2){int i=0,j=0,n,m;n=Strlen(str1);m=Strlen(str2);if(n<m) return 0;while(i<=n-1&&j<=m-1){if(str1[i]==str2[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j==m)return 1;else return 0;}void main(){SString str1,str2;printf("请输入第一个字符串:");scanf("%s",str1);printf("\n");printf("请输入第二个字符串:");scanf("%s",str2);printf("\n");if(SubStr(str1,str2))printf("str2是str1的子串\n");else printf("str2不是str1的子串\n");}公共字符串:#include<stdio.h>#define MAXSTRLEN 255typedef unsigned char SString[MAXSTRLEN+1];int Strlen(SString str){int i=0;while(str[i]!='\0'){i++;}return i;}int maxlen(SString str1,SString str2,SString str){int i, j, h, index, max=0;for(max=Strlen(str2);max>=0;max--){for(i=0; str1[i]; i++)for(j=0; str2[j]; j++){for(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);if(h==max){index = j;for(i=0; i<max; i++){str[i] = str2[index++];}str[max]='\0';return max;}}}}int SubStrnum(SString str1,SString str2){int i=0,j=0,n,m,k=0;n=Strlen(str1);m=Strlen(str2);while(str1[i]){while(str2[j]){if(str1[i]==str2[j]){i++;j++;}else{i=i-j+1;j=0;}if(!str1[i]){break;}}if(!str2[j]){k++;j=0;}} r eturn k;}void main(){SString str1,str2,str3;printf("请输入第一个字符串:");scanf("%s",str1);printf("\n");printf("请输入第二个字符串:");scanf("%s",str2);printf("\n");printf("最大公共子串长度为%d\n",maxlen(str1,str2,str3));printf("公共子串个数为%d\n",SubStrnum(str1,str3)>SubStrnum(str2,str3)?SubStrnum(str1,str3):SubStrnum(str2,str3) );}。

相关文档
最新文档