数据结构 串的定长顺序存储
2016-10-22 17:31
567 查看
#include<stdio.h> #include<stdlib.h> #include<string> #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度 Status StrAssign(SString T,char chars[]) { //赋值 //生成一个其值等于chars的串T。 int i; if(strlen(chars)>MAXSTRLEN) return ERROR; T[0]=strlen(chars); for(i=0;i<=T[0];i++) { T[i+1]=chars[i]; } return OK; } Status StrCopy(SString T,SString S) {//复制 //由串S复制得串T int i; for(i=1;i<=S[0];i++) { T[i]=S[i]; } T[0]=S[0]; return OK; } Status StrEmpty(SString S) {//判空 if(S[0]==0) return TRUE; else return FALSE; } Status Strcompare(SString S,SString T) {//比较 //若S>T,则返回值>0,若S=T,则返回值=0;若S<T,则返回值<0 int i; for(i=1;i<=S[0]&&i<=T[0];i++) { if(S[i]!=T[i]) return S[i]-T[i]; } return S[0]-T[0]; } Status StrLength(SString S) {//长度 return S[0]; } Status Concat(SString T,SString S1,SString S2) { //连接 //用串T返回由S1和S2连接而成的新串。 int i,j; Status uncut; if(S1[0]+S2[0]<=MAXSTRLEN)//未截断 { T[0]=S1[0]+S2[0]; for(i=1;i<=S1[0];i++) { T[i]=S1[i]; } for(j=1;j<=S2[0];j++) { T[S1[0]+j]=S2[j]; } uncut=TRUE; } else if(S1[0]<MAXSTRLEN)//截断 { T[0]=MAXSTRLEN; for(i=1;i<S1[0];i++) { T[i]=S1[i]; } for(j=1;j<=MAXSTRLEN-S1[0];j++) { T[S1[0]+j]=S2[j]; } uncut=FALSE; } else// S1[0]>MAXSTRLEN { T[0]=MAXSTRLEN; for(i=1;i<=MAXSTRLEN;i++) { T[i]=S1[i]; } uncut=FALSE; } return uncut; } Status SubString(SString Sub,SString S,int pos,int len) { //求子串 //用Sub返回串S的第pos个字符起长度为len的子串 int i,j; if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1) return ERROR; if(!len) { Sub=NULL; Sub[0]=0; } else { for(i=1,j=pos;i<=len-1,j<=pos+len-1;i++,j++) Sub[i]=S[j]; Sub[0]=len; } return OK; } Status Index(SString S,SString T,int pos) { //模式匹配 //若主串S中存在和串T相同的子串,则返回它在主串S的第pos个 //字符之后第一次出现的位置,否则函数值为0 int n, m,i; SString Sub; if(pos>0) { n=StrLength(S); m=StrLength(T); i=pos; while(i<=n-m+1) { SubString(Sub, S, i, m); if (Strcompare(Sub, T) != 0) ++i; else return i; } } return 0; } Status StrInsert(SString S,int pos,SString T) { //插入函数 //在串S的第pos个字符之前插入串T。 int i; if (pos<1 || pos>S[0]) return ERROR; if (S[0] + T[0] < MAXSTRLEN)//完全插入 { for (i = S[0]; i >= pos; i--) { S[i + T[0]] = S[i]; } for (i = 1; i <=T[0]; i++) { S[pos-1+i] = T[i]; } S[0] = S[0] + T[0]; return TRUE; } else { for (i = S[0]; i >= MAXSTRLEN-S[0];i--) { S[MAXSTRLEN-S[0]+1] = S[i]; } for (i = 1; i <= MAXSTRLEN - S[0];i++) { S[pos - 1 + i] = T[i]; } return FALSE; } } Status StrDelete(SString S,int pos,int len) { //删除 //从串S中删除第pos个字符起长度为len的子串 int i; if (pos<1 || pos>S[0]) return ERROR; else for (i = pos + len ; i<=S[0]; i++) { S[i-len] = S[i]; } S[0] -= len; return OK; } Status StrPrint(SString S) {//输出函数 int i; for (i = 1; i <= S[0]; i++) { cout << S[i]; } cout << endl; return 0; } int main() { int pos,len; SString S1,S2,T1,T2,Sub; char a[100], b[100]; cout << "请输入两个串,分别赋值给串s1和串s2" << endl; cin >> a >> b; StrAssign(S1, a); StrAssign(S2, b); cout << "把串S1拷贝给T1,输出T1:"; StrCopy(T1, S1); StrPrint(T1); if (StrEmpty(T1) == 1) cout << "串T1为空!" << endl; else cout << "串T1非空!" << endl; if (Strcompare(S1, S2) > 0) cout << "S1>S2" << endl; else if (Strcompare(S1, S2) < 0) cout << "S1<S2" << endl; else cout << "S1=S2" << endl; cout << "连接S1,S2为T2,输出T2:"; if (Concat(T2, S1, S2) == 1) StrPrint(T2); else cout << "串连接失败" << endl; cout << "串T2的长度为:"; cout <<StrLength(T2)<< endl; cout << "请输入求子串的pos和len的值"<<endl; cin >> pos>> len; if (SubString(Sub, S1, pos, len) == 1) { cout << "输出子串Sub:"; StrPrint(Sub); } else cout << "求子串失败!" << endl; if (Index(T2, S2, pos)) { cout << "pos的值为:"; cout << pos << endl; } else cout << "pos的值不合法" << endl; cout << "在串S1的第pos位置插入串S2" << endl; cout << "输入pos的值:"; cin >> pos; if (StrInsert(S1, pos, S2) == 1) { cout << "输出串S1:"; StrPrint(S1); } else cout << "插入失败" << endl; cout << "从串S1中删除第pos位置起长度为len的字符" << endl; cout << "输入pos,len的值:"; cin >> pos >> len; if (StrDelete(S1, pos, len) == 1) { cout << "输出删除后的串S1:"; StrPrint(S1); } else cout << "删除失败" << endl; return 0; }
</pre><pre><pre name="code" class="cpp">
相关文章推荐
- javascript实现数据结构:串--定长顺序存储表示以及kmp算法实现
- 数据结构--串--定长顺序存储表示
- 数据结构-串的定长顺序存储
- (C语言)串定长顺序存储实现(数据结构十二)
- (C语言)串定长顺序存储实现(数据结构十二)
- c语言版数据结构(奇迹冬瓜)-串(定长顺序存储各项操作)
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- 学习笔记------数据结构(C语言版)串的定长顺序存储表示
- 数据结构学习之循环队列(顺序存储)
- 数据结构存储的顺序和链式对比
- 数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例
- 数据结构:栈的顺序存储
- 第四章(1)定长顺序存储表示
- 数据结构——四种基本的数据存储结【顺序存储】【链接存储】【索引存储】【哈希存储】
- 数据结构 串(顺序存储)的基本操作
- 数据结构中数组的顺序存储
- 串的定长顺序存储
- 数据结构存储的顺序和链式对比
- 数据结构例子-栈的顺序存储(利用数组)
- 【数据结构】线性表的顺序存储完整程序