数据结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)字符串连接 初始条件:串s,t存在。 操作结果:将一个串s紧接着放在另一个串t的后面, 连接成一个新串s。 SqString Str_Concat(SqString s, SqString t) { SqString str; int i; str.len=s.len+t.len; for (i=0;i<s.len;i++) /*s.data[0..s.len-1]=>str*/ str.data[i]=s.data[i]; for (i=0;i<t.len;i++) /*t.data[0..t.len-1]=>str*/ str.data[s.len+i]=t.data[i]; return str; }
(2)字符串比较
初始条件:串s,t存在。
操作结果:若s1==s2,操作返回值为1;否则返回结果为0。 int Str_Equal(SqString s,SqString t) { int same=1,i; if (s.len!=t.len) same=0; /*长度不相等时返回0*/ else for (i=0;i<s.len;i++) if (s.data[i]!=t.data[i]) /*有1个对应字符不同时返回0*/ { same=0; break; } return same; }
int len;
} SqString;
(1)字符串赋值 初始条件: cstr是一个字符串常量。 操作结果:把字符串常量cstr的内容赋给str所指向的
存储空间。
void Str_Assign(SqString *str,char cstr[]) { int i; for(i=0;cstr[i]!='\0';i++) str->data[i]=cstr[i]; str-> data[i+1]='\0'; str-> len=i; }
(2源自文库串连接
初始条件:串s1,,s2存在。 操作结果:两个串的联接就是将一个串的串值紧接着放在另一个 串的后面,连接成一个新串。
LiString * Str_Concat (LiString *s1, LiString *s2)//连接子串 { while(p2!=NULL) LiString *p1,*p2,*h,*s,*q; *p1=s1->next, {s=(LiString*)malloc(sizeof(LiString)); *p2=s2->next, q->next=s; h=(LiString*)malloc(sizeof(LiString)); h->next=NULL; q=s; q=h; s->data=p2->data; while(p1!=NULL) p2=p2->next; {s=(LiString*)malloc(sizeof(LiString)); q->next=s; } q=s; s->next=NULL; s->data=p1->data; p1=p1->next; return h; }
void Str_Assign(LiString *&S,char a[])//串的初始化 { LiString *p,*q; int j; S=( LiString *)malloc(sizeof(LiString)); q=S; for(j=0;a[j]!='\0';j++) { p=( LiString *)malloc(sizeof(LiString)); p->data=a[j]; q->next=p; p->next=NULL; q=p; } }
4.3 串的链式存储及基本运算 二、串的链式存储结构 1、串的链式存储就是采用单链表方式来存储串值。 方便插入和删除操作。
2、链串的存储结构类型定义如下: typedef struct node { char data; struct node *next; } LiString;
4.3 串的链式存储及基本运算 (1)串赋值 初始条件: L是一个指向串的指针,a是一字符串。 操作结果:将a串值赋值给L。
}
(3)求串长度
初始条件:串s存在。
操作结果:把串的长度求出并返回。 int Str_Length(LiString *S)//求串的长度 { LiString *p=S->next; int i=0; while(p!=NULL) { p=p->next; i++; } return i; }
(4)求子串 初始条件:串s存在,1≤i≤s.len,0≤len≤s.len-i+1。 操作结果:返回从串s的第i个字符开始的长度为j的子串。 j=0得到的是空串。 操作步骤:找到第i个字符的位置,把t插入在s的第i个 字符的后面。
(7)串插入 Str_Insert(s,i,t) 初始条件:串s,t存在,1≤i≤StrLength(s)+1。 操作结果:将串t插入到串s 的第i个字符位置上,s的 串值发生改变。 (8)串删除 Str_Delete(s,i,len) 初始条件:串s存在,1≤i≤StrLength(s), 0≤len≤StrLength(s)-i+1。 操作结果:删除串s 中从第i个字符开始的长度为len的 子串,s的串值改变。 (9)串替换 Str_Rep(s,t,r) 初始条件:串s,t,r存在,t不为空。 操作结果:用串r 替换串s中出现的所有与串t相等的不 重叠的子串,s的串值改变。
算法4.8如下: LiString *Str_Sub(LiString *L, int i, int j)//求子串 while(n<=i+j-1) { LiString *p=S->next,*h,*s,*q; {s=(LiString*)malloc(sizeof(LiString)); int n=1,t=Str_Length(L); q->next=s; h=(LiString*)malloc(sizeof(LiString)); q=s; h->next=NULL; s->data=p->data; if(i<=0||i>t||i+j-1>t||j<0) p=p->next; return h; n++; q=h; } while(n<i) s->next=NULL; { n++; p=p->next; } return h; }
4.2串的定长顺序存储及基本运算
1、串的顺序存储就是把串所包含的字符序列依次存 入连续的存储单元中去,也就是用向量来存储串。 0 ‘D’ 1 ‘A’ 2 ‘ T’ 3 4 ‘A’ ‘\0’
2、顺序串的存储结构类型定义如下:
#define MaxSize 50 typedef struct { char data[MaxSize];
(4)求子串 初始条件:串s存在,1≤i≤s.len,0≤len≤s.len-i+1。 操作结果:返回从串s的第i个字符开始的长度为j的子串。 j=0得到的是空串。 SqString Str_Sub(SqString s,int i,int j) { SqString str; int k; str.len=0; if (i<=0 || i>s.len || j<0 || i+j-1>s.len) { printf("参数不正确\n"); return str; /*参数不正确时返回空串*/ } for (k=i-1;k<i+j-1;k++) /*s.data[i..i+j]=>str*/ str.data[k-i+1]=s.data[k]; str.len=j; return str; }
【例4-1】设计顺序串上实现串比较运算 Str_cmp(s,t)的算法。 int Str_cmp(SqString s,SqString t)
#define MaxSize 100 #include<string.h> #include<stdio.h> typedef struct { char data[MaxSize]; int len; } SqString; void Str_Assign(SqString *str,char cstr[]) { int i; for(i=0;cstr[i]!='\0';i++) (*str).data[i]=cstr[i]; (*str).data[i+1]='\0'; (*str).len=i; } { int i,comlen; if(s.len<t.len) comlen=s.len;/*求s与t中较短的长度*/ else comlen=t.len; for(i=0;i<comlen;i++) /*逐个字符比较*/ if(s.data[i]<t.data[i]) return -1; else if(s.data[i]>t.data[i]) return 1; if(s.len==t.len) return 0; /*s==t*/ else if(s.len<t.len) return -1; /*s<t*/ else return 1; /*s>t*/ void main() } s1,s2; {SqString char cstr1[100],cstr2[100]; printf("请输入字符串s1:"); scanf("%s",cstr1); printf("请输入字符串s2:"); scanf("%s",cstr2); Str_Assign(&s1,cstr1);/*调用算法4.1,给s1赋值*/ Str_Assign(&s2,cstr2); /*调用算法4.1,给s2赋值*/ printf("返回值是:%d\n",Str_cmp(s1,s2)); }
串相等 称两个串是相等的,是指两个串的长度相等且对应 位置的字符都相等。
4.1.2 串的基本运算
(1)求串长Str_Length(s) 初始条件:串s存在。 操作结果:求出串s的长度。 int Str_Length(char *s); 例如:printf("%d",Str_Length(s)); (2)串赋值Str_Assign(s1,s2) 初始条件: s1是一个串变量,s2是一个串常量或是一 个串变量。 操作结果:将s2串值赋给s1,s1原来的值被覆盖掉。 char *Str_Assign(char *to,char *from);// 例如:Str_Assign(s3,s1); //s3="www",s1串不变
2、空串(string)是长度为零的串,它不 包含任何字符。例如: "" 3、空白串(string)是由一个或多个空格 组成的串。 例如: " "
2.常用术语
子串与主串:
串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
子串的位置:
子串的第一个字符在主串中的序号称为子串的位置。
第四章
串和数组
数据结构
书名:数据结构 书号:978-7-11149031-9 作者:主 编 马世霞 出版社:机械工业出 版社 配套教案,习题答案
本章要点
串和数组的概念 串的简单应用 数组的存储形式
4.1 串及其基本运算
4.1.1 串的基本概念
1.串的定义 串是由零个或多个任意字符组成的字符序列。 一般记作:
4.1.2 串的基本运算
(3)连接操作:Str_Concat (s1,s2) 初始条件:串s1,s2存在。 操作结果:将一个串的串值紧接着放在另一个串的后 面,连接成一 个串。 例如: s1="he",s2="nan",结果s1="henan"。 (4)求子串Str _ Sub (s,i,len) 初始条件:串s存在,1≤i≤StrLength(s), 0≤len≤StrLength(s)-i+1。 操作结果:返回从串s的第i个字符开始的长度为 len 的子 串。len=0得到的是空串。 例如:Str_Sub("abcdefghi",3,4)="cdef"。
(5)串比较Str_Equal (s1,s2) 初始条件:串s1,s2存在。 操作结果:若s1==s2,返回值为1;否则返回结果为0。 int Str_Equal (char *s1,char *s2); 比较s1和s2大小,当s1<s2、s1>s2和s1=s2时, 分别返回 小于0、大于0和等于0的值 (6)子串定位 Str_Index(s,t):找子串t在主串s中首次 出现的位置。 操作条件:串s,t存在。 操作结果:若t∈s,则操作返回t在s中首次出现的位置, 否则返回值为-1。 如:Str_Index("abcdebda","bc")=2 Str_Index("abcdebda","ba")=-1