数据结构C语言串的基本操作

合集下载

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

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

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

在本实验中,我们将学习串的基本操作,并使用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串的长度操作求串的长度,即求一个串中字符的个数。

C语言第3章 数据描述与基本操作

C语言第3章 数据描述与基本操作

C语言使用的基本表达式有: 语言使用的基本表达式有: 语言使用的基本表达式有 ⑴赋值表达式,如:a=3 赋值表达式, ⑵算数表达式,如:3+4*2 算数表达式, ⑶关系表达式,如:3>2 关系表达式, ⑷逻辑表达式,如:3>5&&a>=b 逻辑表达式, ⑸条件表达式,如:a>b?a:b 条件表达式, ⑹逗号表达式,如:a=3,b=4,c=5 逗号表达式,
● 赋值运算符的结合性是自右向左
(3) 赋值运算符的使用 设变量定义如下: char c1=‘a’,c2; int n1=65,n2,n3,n4,n5,n6; float f1=3.0,f2; 则: ① c2=n1运算后,c2的值是65,n1的值不变。 n2 !c1 n2 0 c1 ② n2=!c1运算后,n2的值是0,c1的值不变。 ③ f2=f1+0.001运算后,f2的值是3.001,f1的值不变。 ④ n3=c1==n1||c1!=n1运算后,n3的值是1,c1和n1 的值不变。 注:运算顺序相当于 n3=((c1==n1)||(c1!=n1)) ⑤ n4=n5=n6=-(――n1)运算后,n4,n5,n6的值 均是-64,n1的值是64。 注意:上述表达式的值就等于赋值表达式中的最左边的变量值。 注意
三.赋值运算符 赋值运算符
1.赋值运算符
赋值运算符是双目运算符,赋值运算符的左边必须是变量, 右边是表达式。 (1) 赋值运算符的运算对象及有关规则如下表:
对象数 名称 运算符 运算规则 运算结果 结合性 表达式的 自右向左 将表达式的 双目 赋值 =
值赋予变量 类型
(2) 赋值运算符的优先级 ● 算术运算符 优先于 关系运算符 优先于 双目逻为2,
则:① b=a+3,c=b+4 运算结果:a不变,b为5,c为9,表达式的值为9 ② d=a――,e=d――,f=――e 运算结果:a为1,d为1,e为1,f为1,表达式的值为1

数据结构(C语言版)_第3章 串与数组

数据结构(C语言版)_第3章 串与数组
typedef struct lnode {
char data; struct lnode *next;
}lstring;
3.3.3 串的存储结构——链式存储结构
当结点大小>1时,可以采用块链结构。
#define CHUNKSIZE 100
/*可由用户定义块的大小*/
typedef struct Chunk
第三章 串与数组
本章要点
➢字符串的基本概念与基本运算 ➢字符串的存储和基本运算的实现 ➢数组的概念和基本运算 ➢数组的存储结构 ➢特殊矩阵的压缩存储及运算 ➢广义表的概念及相关术语 ➢广义表的存储形式
3.1 “文学研究助手”案例导入
“文学研究助手”引例:请从下面的英文文章里,统计其中 good出现的次数和位置,并查找单词the所在的行号,该行中出 现的次数以及在该行中的相应位置。
3.4.1 数组的定义
数组是n个具有相同类型的数据元素构成的有限序列,数组 中的数据是按顺序存储在一块地址连续的存储单元中。
数组中的每一个数据通常称为数组元素,数组元素用下标 区分,其中下标的个数由数组的维数决定。
若线性表中的数据元素为非结构的简单元素,则称为一维 数组,又称为向量;若一维数组中的数据元素又是一维数组结 构,则称为二维数组;依次类推,若二维数组中的元素又是一 个一维数组结构,则称作三维数组。
3.3.4 串的基本操作的实现算法
第二种顺序存储方式下几种基本操作的算法
算法1:串连接操作 算法2:串比较操作 算法3:取子串操作 算法4:串插入操作 算法5:串删除操作 算法6:串置换函数 算法7:子串定位操作
3.3.5 串的应用
【例3-1】设计一个算法求串s中出现的第1个最长重复子串 及其位置。

串的知识点总结

串的知识点总结

串的知识点总结1. 串的基本概念串是由零个或多个字符组成的有限序列,通常用来表示文本数据。

在编程语言中,串通常被定义为一个字符数组或字符串变量。

例如,在C语言中,字符串通常被定义为char类型的数组,而在Java语言中,字符串则是一个类对象。

2. 串的存储结构串的存储结构有两种常见形式:一是定长顺序存储结构,二是链式存储结构。

定长顺序存储结构是将串的字符按照顺序存储在一块连续的存储空间中,这种方式可以通过下标来访问任意位置的字符,但是需要预先分配足够的存储空间。

链式存储结构则是使用链表来存储串的字符,这种方式可以动态分配内存空间,但是访问任意位置的字符需要从链表头开始遍历,效率较低。

3. 串的基本操作串的基本操作包括串的创建、复制、连接、比较、插入和删除等。

创建串是指将一组字符转换成串的操作;复制是指将一个串的内容复制到另一个串中;连接是指将两个串连接在一起形成一个新的串;比较是指比较两个串的大小关系;插入是指在一个串中的指定位置插入一个子串;删除是指删除一个串中的指定子串。

这些操作都是串的基本操作,它们在实际应用中有着重要的作用。

4. 串的模式匹配串的模式匹配是指在一个主串中查找与给定模式串相匹配的子串的过程。

常见的模式匹配算法有暴力匹配算法、KMP算法和Boyer-Moore算法等。

暴力匹配算法是最简单的模式匹配算法,它的时间复杂度为O(m*n),其中m为主串长度,n为模式串长度;KMP算法是一种高效的模式匹配算法,它的时间复杂度为O(m+n),其中m为主串长度,n为模式串长度;Boyer-Moore算法是一种更加高效的模式匹配算法,它的时间复杂度为O(m*n),其中m为主串长度,n为模式串长度。

5. 串的应用串在计算机科学中有着广泛的应用,它在各种应用中都有着重要的作用。

例如,在文本编辑器中,串被用来表示文本文件的内容;在数据库系统中,串被用来表示数据的各种属性;在网络通信中,串被用来表示网页的URL地址等。

c语言中常用的串运算

c语言中常用的串运算

c语言中常用的串运算C语言中常用的串运算一、引言在C语言中,串是一种常见的数据结构,用于存储和处理字符序列。

串运算是对串进行操作和处理的一系列操作,包括串的赋值、连接、比较、复制等。

本文将介绍C语言中常用的串运算及其应用。

二、串的定义和初始化在C语言中,串可以通过字符数组来表示,每个字符占据一个数组元素的位置。

定义一个串可以使用字符数组,并使用字符串常量或字符指针进行初始化。

例如:```cchar str1[10] = "Hello";char *str2 = "World";```上述代码中,str1是一个字符数组,长度为10,初始化为"Hello";str2是一个字符指针,指向字符串常量"World"。

三、串的赋值串的赋值是将一个串的内容复制到另一个串中。

在C语言中,可以使用strcpy函数实现串的赋值。

例如:```cchar str1[10] = "Hello";char str2[10];strcpy(str2, str1);```上述代码中,将str1的内容复制到str2中,结果为str2="Hello"。

四、串的连接串的连接是将两个串合并成一个串。

在C语言中,可以使用strcat 函数实现串的连接。

例如:```cchar str1[10] = "Hello";char str2[10] = "World";strcat(str1, str2);```上述代码中,将str2连接到str1的末尾,结果为str1="HelloWorld"。

五、串的比较串的比较是判断两个串是否相等或大小关系的操作。

在C语言中,可以使用strcmp函数实现串的比较。

例如:```cchar str1[10] = "Hello";char str2[10] = "World";int result = strcmp(str1, str2);```上述代码中,比较str1和str2的大小关系,结果存储在result变量中。

数据结构第4章 串

数据结构第4章  串
ring s, SString t)
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;

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;}。

数据结构(C语言版)

数据结构(C语言版)

比较
Prim算法适用于稠密图, Kruskal算法适用于稀疏图;
两者时间复杂度相近,但 Kruskal算法需额外处理并查
集数据结构。
最短路径算法设计思想及实现方法比较
1 2
Dijkstra算法
从源点出发,每次找到距离源点最近的顶点并更 新距离值,直至所有顶点距离确定。适用于不含 负权边的图。
Floyd算法
特殊二叉树
满二叉树、完全二叉树等。
二叉树的遍历与线索化
二叉树的遍历
前序遍历、中序遍历、后序遍历和层 次遍历是二叉树的四种基本遍历方法 。
线索化二叉树
为了方便查找二叉树节点的前驱和后 继,可以对二叉树进行线索化处理, 即在节点的空指针域中存放指向前驱 或后继的指针。
树和森林的遍历与转换
树的遍历
01
串的顺序存储结构
01
02
03
串的顺序存储结构是用 一组地址连续的存储单 元来存储串中的字符序
列的。
按照预定义的大小,为 每个定义的串变量分配 一个固定长度的存储区 ,一般是用定长数组来
定义。
串值的存储:将实际串 长度值保存在数组的0下 标位置,串的字符序列 依次存放在从1开始的数
组元素中。
串的链式存储结构
03
比较
DFS空间复杂度较低,适用于递 归实现;BFS可找到最短路径, 适用于非递归实现。
最小生成树算法设计思想及实现方法比较
Prim算法
从某一顶点开始,每次选择当 前生成树与外界最近的边加入 生成树中,直至所有顶点加入

Kruskal算法
按边权值从小到大排序,依次 选择边加入生成树中,保证不
形成环路。
数据结构(C语言版)

数据结构(C语言版CHAP4

数据结构(C语言版CHAP4

结束
第 6 页
4. 1
串的基本概念
3 串的基本操作 串的逻辑结构与线性表一样,都是线性结构。但由于串的应用与线性 表不同,串的基本操作与线性表有很大差别。
1)串赋值操作StrAssign( &T, chars) 功能:将串常量char的值赋给串变量T; 2)复制串操作 StrCopy(&T,S) 功能:由串变量S复制得到串变量T; 3)判空操作 StrEmpty(S) 功能:若为空串,则返回TRUE,否则返回FALSE 4) 串比较操作 StrCompare( S, T) 功能若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值 <0 5)串置空操作 ClearString( &S) 功能:将S清为空串 结束 第 7 页
结束
第 2 页
第四章

第四章

4.1 4.2 4.3
串的基本概念 串存储和实现 串的匹配算法
结束
第 3 页
4. 1
串的基本概念
一、串的定义 1 什么是串 串是一种特殊的线性表,它是由零个或多个字符组成的有限序列, 一般记作 s = ‘a1,a2, a3, ... an’ 其中 s----串名, a1,a2, a3, ... an----串值 串的应用非常广泛,许多高级语言中都把串的作为基本数据类型。在 事务处理程序中,顾客的姓名、地址货物的名称、产地可作为字符串处 理,文本文件中的每一行字符等也可作为字符串处理。
11)串删除操作 StrDelete( &S, pos , len) 功能:从串S中删除第pos个字符起长度len 为子串
结束
第 8 页
4.2
串存储和实现

数据结构c语言版 (4)

数据结构c语言版 (4)

8. 在具有n个单元的循环队列中,队满时共有 ____个元素。 9. 一个栈的输入序列是12345,则栈的输出序 列43512是____。 10.二维数组A[10..20][5..10]采用行序为主方式 存储,每个元素占4个存储单元,并且 A[10][5]的存储地址是1000,则A[18][9]的地 址是____。 四、设有一个顺序栈S,元素s1, s2, s3, s4 , s5, s6依次进栈,如果6个元素的出栈顺 序为s2, s3, s4, s6, s5, s1,则顺序栈 的容量至少应为多少?
子串的位置:子串在主串中第一次出现的第一个字 符的位置。 两个串相等:两个串的长度相等,并且各个对应的 字符也都相同。 a= “program” b= “Program” c= “pro” d= “program ”
串的基本操作:

(1) 创建串 StringAssign (s,string_constant)
a0 0 a0 1 ... a0 ,n 1
a1 0
a1 1
...
a1 ,n 1
...
...
a m1 ,0
a m1 ,1
...
a m-1 , n 1
第0行
a0 0 a1 0 ... a m1 ,0
第1行
a0 1 a1 1 ... a m-1 ,1 ... ... a 0 ,n -1
第m-1行
a 1 ,n -1 ... a m1 ,n -1
矩阵的压缩存储
为多个值相同的元素只分配一个存储空间,对0元 素不分配空间。
1.对称矩阵
aij=aji
K=
{
矩阵的压缩存储
2. 三角矩阵 b. 上三角矩阵
K=
{

数据结构——串

数据结构——串

7
三、串的基本操作 C语言中常用的串运算 定义下列几个变量: char s1[20]=“dirtreeformat”,s2[20]=“file.mem”; char s3[30],*p; int result;
(1) 求串长(length) int strlen(char s); //求串的长度
例如:printf(“%d”,strlen(s1)); 输出13
char strcat(char s1 , char s2)
该函数将串s2复制到串s1的末尾,并且返回一 个指向串s1的开始处的指针。
例如:strcat(a3,”/”)
strcat(a3,a2);
2020//4//a143=“dirtreeformat/file.mem”
9
(4)串比较(compare)
A=“This is a string” B=“is” B在A中出现了两次,其中首次出现所对应的主串
位置是3。因此,称B在A中的序号(或位置)为3 特别地,空串是任意串的子串,任意串是其自身的子
串。
2020/4/14
5
二、串的抽象数据定义
• ADT String { • 数据对象:D={ai| ai
16
顺序串的类型定义和顺序表类似: typedef char ElemType;
typedef struct { ElemType ch[maxstrlen]; int length;
}sstring; //其优点是涉及到串长操作时速度快。
2020/4/14
17
4.2.2 堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元存 放字符串序列,但它们的存储空间是在程序执行过程中动态 分配而得。所以也称为动态存储分配的顺序表。在C语言中, 利用malloc和realloc,free等动态存储管理函数,来根据实 际需要动态分配和释放字符数组空间。这样定义的顺序串类

数据结构串的性质和基本操作本

数据结构串的性质和基本操作本
S
S s s p r i n p r i n

g
^
g # # # # ^
直接采用第一种链表 存储串值,进行操 作时效率太低。
串的块链存储表示
块的结构定义
#define CHUNKSIZE 80 ∥可由用户定义的块大小
typedef struct Chunk{ ∥结点结构
char ch[CHUNKSIZE];
本章内容
4.1 串的定义 4.2 串的表示和实现
1.串的顺序存储结构 2.串的链式存储结构
4.3 串的模式匹配算法
1.朴素的模式匹配算法
2.KMP算法
串的定义和相关概念
1.串的定义
串( String ) : 由零个或多个字符组成的有限序列。 记为:s=’a1a2…an’(n≥0)
2.相关概念
s为串名, ’a1a2…an’为串值,n为串的长度。 ai,约束为字符集中的字符。 空串(Null String):n=0,记为:Ф 。 子串在主串中的位置:以子串的第一个字符在 空格串 (blank string) :串中仅包含空格字符。 主串中的位置来表示。 串相等:当且仅当两个串的串值相等(两个串的长 子串:串中任意个连续的字符组成的子序列称为 该串的子串。包含子串的串被称为主串。 度相等,并且各个对应的字符也都相等)。
例如:串的联接算法中需分三种情况处理:
Status Concat(SString S1, SString S2, SString &T) {
// 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。
return uncut; } // Concat
if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断 T[1..S1[0]] = S1[1..S1[0]]; else if (S1[0] <MAXSTRSIZE) { // 截断 T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]]; T[1..S1[0]] = S1[1..S1[0]]; T[0] = S1[0]+S2[0]; uncut else { // 截断(仅取 S1) = TRUE; } T[S1[0]+1..MAXSTRLEN] = T[0..MAXSTRLEN] = S1[0..MAXSTRLEN]; S2[1..MAXSTRLEN-S1[0]]; // T[0] == S1[0] == MAXSTRLEN T[0] = MAXSTRLEN; uncut = FALSE; } uncut = FALSE; }

数据结构(CC++语言版)第4章串

数据结构(CC++语言版)第4章串


else return -1;
•}
34
4.3 模式匹配
35
4.3 模式匹配
朴素的模式匹配——BF算法分析
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
36
4.3 模式匹配
T[strLength(S1) +i]=S2[i]; strLength(T) =MAXSTRLEN; return FALSE; } }
CompStr (S, T)
初始条件:串 S 和 T 存在。 操作结果:若S T,则返回值 0;
若S T,则返回值 0; 若S T,则返回值 0
例如:CompStr(data, state) < 0 CompStr(capture, case) > 0
• 由于在计算机科学、生物信息学等许多领域的重要应用, 串模式匹配已经变成了一个非常重要的计算问题
28
4.3 模式匹配
常用的模式匹配算法: • 朴素的模式匹配(BF算法) • 无回溯的模式匹配(KMP算法) 其他模式匹配算法
29
4.3 模式匹配
朴素的模式匹配——BF算法
基本思想:从主串S的第一个字符开始和模式T 的第 一个字符进行比较,若相等,则继续比较两者的后 续字符;否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的 字符全部比较完毕,则说明本趟匹配成功;或S中字 符全部比较完,则说明匹配失败。
S1="ab12 cd " S2="ab12" S3=“cd"

串的操作实验报告

串的操作实验报告

数据结构实验报告报告名称串的操作专业网络工程班级学号姓名指导教师陈淑红李珍辉黄哲年月日一、实验目的:熟悉串类型的实现方法,了解简单文字处理的设计方法。

二、实验内容与基本要求:1.设计可以在主串s中第i个位置之前插入一个子串t的程序。

2.设计可以在主串s中从第i个位置开始共取m个字符,求子串的程序。

3.设计一个程序求子串t在主串s中的起始位置三、概要设计:1.数据结构:#include <stdio.h>#define MaxSize 100 /*最多的字符个数*/typedef struct{ char data[MaxSize]; /*定义可容纳MaxSize个字符的空间*/ int len; /*标记当前实际串长*/} SqString;2.抽象数据类型:ADT String {数据对象:D={ a i |a i∈CharacterSet,i=1,2,...,n, n≥0 }数据关系:R1={ < a i-1, a i > | a i-1, a i∈D, i=2,...,n }StrAssign (&T, chars)初始条件:chars 是字符串常量。

操作结果:把chars 赋为T 的值。

StrCopy (&T, S)初始条件:串S 存在。

操作结果:由串S 复制得串T。

DestroyString (&S)初始条件:串S 存在。

操作结果:串S 被销毁。

StrEmpty(S)初始条件:串S存在。

操作结果:若S 为空串,则返回TRUE,否则返回FALSE。

StrCompare (S, T)初始条件:串S 和T 存在。

操作结果:若S > T,则返回值> 0;若S = T,则返回值= 0;若S < T,则返回值< 0。

StrLength (S)初始条件:串S 存在。

操作结果:返回S 的元素个数,称为串的长度。

Concat (&T, S1, S2)初始条件:串S1 和S2 存在。

串的定义及其基本运算

串的定义及其基本运算
例如操作前:s1="he",s2=" bei",
则操作结果是s1="he bei"
(4)串比较 strcmp(s1,s2); 操作结果:若s1==s2,返回值为0;若s1<s2, 返回值<0;若 s1>s2, 返回值>0。
result= strcmp("abc","Abc");/* result>O */
5页
2020/9/19
数据结构(C语言版)
第5章 串
(2)串拷贝strcpy (s1,s2) ; 执行操作:将s2的串值赋值给s1。 操作结果:串s1的值与串s2的值相等,s1原来的值被覆盖掉。 例如 strcpy (str3,str1)
(3)连接操作 :strcat (s1,s2) ; 操作结果:将字符串s2连接 在s1的后面,s2不改变。
例如:substr(str1, str3,5,3),则str3="bin"
再例如:substr(str1, str3,14,3),则str3=NULL
(6)子串定位 strindex(s,t);找子串t在主串s中首次出 现的位置
操作结果:若t∈s,则操作返回t在s中首次出现的位置, 否则返回值为-1。
串的链式存储结构简称为链串。其结点数据域为单个
子串的位置:子串在主串中首次出现时,该子串的 首字符对应主串的序号称为子串在主串中的位置。
例如,设A和B分别为
A="This is a string”,B ="is“
则B是A的子串,A为主串。且位置是3。
4页
2020/9/19
数据结构(C语言版)
第5章 串
特别规定,空串是任意串的子串,任意串是其自身 的子串。 串相等:两个串相等,是指两个串的长度相等且对 应字符都相同。

2、C语言数据描述与基本操作

2、C语言数据描述与基本操作
char c1,c2; #include<stdio.h> int main() { char c1='a',c2='b'; c1=c1-('a'-'A'); c2=c2-('a'-'A'); printf("%c %c\n",c1,c2); return 0; } 程序运行结果: A B
25
C语言程序设计
C语言程序设计
1
C语言程序设计
教学目标
掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法
2
C语言程序设计
本章主要内容
2.1 工作场景导入 2.2 数据类型 2.3 运算符与表达式 2.4 不同类型数据间的混合运算 2.5 回到工作场景
小数形式:0~9,小数点和正负号表示 指数形式:0~9、小数点、+ -号和字母e/E
说明: (1)浮点型常量的默认类型是double (2)在常量后面加f或F指定为float型 (3)指数必须为整数 (4)e/E之前必须有数字
19
C语言程序设计
2.4浮点型数据
浮点型变量的分类
单精度(float) 双精度(double)
27
C语言程序设计
2.6运算符与表达式、数据类型的转换
2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 算术运算符 自增和自减运算符 赋值运算符 关系和逻辑运算符 条件运算符 逗号运算符
28
m pq r
C语言程序设计
2.6.1算术运算符

c语言 字符串加减乘除

c语言 字符串加减乘除

c语言字符串加减乘除C 语言中,字符串是以字符数组的形式存储的,可以进行一些基本的操作,如加减乘除。

本文将详细介绍C 语言中如何进行字符串的加减乘除操作,并给出相应的代码示例,以帮助读者更好地理解和掌握这些操作。

1. 字符串的加法操作在C 语言中,字符串的加法操作可以通过字符串拼接实现。

字符串拼接需要使用strcat 函数,该函数的原型为:cchar *strcat(char *dest, const char *src);其中dest 为目标字符串,src 为源字符串。

该函数将源字符串src 拼接到目标字符串dest 的末尾,并返回拼接后的目标字符串dest。

下面是一个简单的示例,演示了如何使用strcat 函数实现字符串的拼接操作:c#include <stdio.h>#include <string.h>int main() {char str1[20] = "Hello";char str2[20] = "World";strcat(str1, str2);printf("%s\n", str1); 输出拼接后的字符串"HelloWorld"return 0;}2. 字符串的减法操作在C 语言中,字符串的减法操作并不直接支持。

但是,可以通过一些手动的方式实现字符串的删除操作。

例如,可以通过遍历字符串的方式,找到需要删除的字符,并将其删除。

下面是一个简单的示例,演示了如何通过手动操作实现字符串的删除操作:c#include <stdio.h>#include <string.h>int main() {char str[20] = "HelloWorld";int len = strlen(str);for (int i = 0; i < len; i++) {if (str[i] == 'o') {memmove(str + i, str + i + 1, len - i);len;i;}}printf("%s\n", str); 输出删除指定字符后的字符串"HellWrld"return 0;}3. 字符串的乘法操作在C 语言中,字符串的乘法操作也不直接支持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
next[i]=j;
else
next[i]=next[j];
}
j=next[j];
}
return -1;
}
void findNextString(char *p,int *next)
{Hale Waihona Puke int len=strlen(p);
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1 || p[i]==p[j])
}
void printStr(HString *t)
{
int i=0;
while(i++<t->length)
{
putchar(t->ch[i-1]);
//printf("第%d个:%c\n",i-1,t->ch[i-1]);
}
putchar('\n');
}
int indexBF(HString *s,HString *t,int pos)
printf("\n");
}break;
case '6':{
i=0;
printf("请输入要找串的起始位置(第几个字符?)\n");
scanf("%d",&h);
printf("请输入要找的字符个数\n");
scanf("%d",&k);
printf("内容为:\n");
for(i=0;i<k;i++)
int i=0;
l=(Hstr *)malloc(sizeof(Hstr));
p=(Hstr *)malloc(sizeof(Hstr));
r=(Hstr *)malloc(sizeof(Hstr));
l->length=0;
p->length=0;
r->length=0;
printf("请选择相关操作(数字1~5控制,输入0结束)\n");
{
i++;
j++;
if(p[i]!=p[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j=next[j];
}
}
}
void findNext2(HString *p,int *next)
{
int len=p->length;
char *c=p->ch;
int i=0,j=-1;
if((l->ch[i]-r->ch[i])>0){printf("第一个串大"); printf("\n");}
break;}
}
if(i==r->length||i==l->length)printf("两个串一样大\n");
}break;
case'5':{i=0;
printf("请输入要与原串连接的串(#结束)\n");
for(i=0,j=0;i<r->length;i++,j++)
l->ch[l->length+i]=r->ch[j];
l->length=l->length+r->length;
printf("连接后第一个串中字符为\n");
for(i=0;i<l->length;i++)
printf("%c",l->ch[i]);
printf("%c",p->ch[i]);
printf("\n");
}break;
case '4':{i=0;
printf("请输入要与原串比较的字符串(#结束):\n");
scanf("%c",&c);
while(c!='#')
{ r->length++;
r->ch[i]=c;
i++;
scanf("%c",&c);
}break;
case '2':{
printf("串长度为%d\n",l->length);}break;
case '3':{
for(i=0;i<l->length;i++)
{
p->ch[i]=l->ch[i];
}
p->length=l->length;
printf("复制的串中字符为\n");
for(i=0;i<p->length;i++)
printf("--------------5.串连接---------------\n");
printf("--------------6.返回值---------------\n");
scanf("%c",&w);
getchar();
while(w)
{
switch(w)
{
case '1':{printf("请输入字符(#结束):\n");
{
printf("%c",l->ch[h-1]);
h++;
}
printf("\n");
}break;
}
getchar();
printf("请选择相关操作(数字1~6控制,输入0结束)\n");
printf("--------------1.建立串---------------\n");
printf("--------------2.显示串长度-----------\n");
return -1;
}
int findNext(HString *p,int *next)
{
int i=0,j=-1;
next[0]=-1;
while(i<p->length)
{
while(j==-1||i < p->length && p->ch[i]==p->ch[j])
{
i++;
j++;
if(p->ch[i]!=p->ch[j])
s->ch[i+t->length]=s->ch[i];
for(i=0;i<t->length;i++)
s->ch[pos+i]=t->ch[i];
s->length+=t->length;
}
return true;
}
int strLength(HString *s)
{
return s->length;
int length;
}HString;
bool assign(HString *t,char *chs)
{
int i=0;
char *c=chs,*d=chs;
while(c[i])//c不为空时进入循环
{
i++;//计算字符串常量chs的长度
}
if(!i)
{
t->ch=NULL;
t->length=0;
scanf("%c",&c);
while(c!='#')
{ l->length++;
l->ch[i]=c;
i++;
scanf("%c",&c);
}
printf("串中字符为\n");
for(i=0;i<l->length;i++)
printf("%c",l->ch[i]);
printf("\n");
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j==plen)
return i-plen;
return -1;
}
int kmp2(HString *t,HString *p,int pos)
{
int *next=(int*)malloc(p->length*sizeof(int));
int i=pos,j=0;
printf("--------------3.生成与原来相同的串---\n");
printf("--------------4.串比较---------------\n");
printf("--------------5.串连接---------------\n");
printf("--------------6.返回值---------------\n");
相关文档
最新文档