网站开发如何学习,医疗器械管理软件,4399小游戏在线玩网页版,电商平台系统开发方案1.定义
假设以一维数组heap #xff3b;MAXSIZE#xff3d; 表示可供字符串进行动态分配的存储空间#xff0c;并设 int start 指向heap 中未分配区域的开始地址(初始化时start 0) 。在程序执行过程中#xff0c;当生成一个新串时#xff0c;就从start指示的位置起#…1.定义
假设以一维数组heap MAXSIZE 表示可供字符串进行动态分配的存储空间并设 int start 指向heap 中未分配区域的开始地址(初始化时start 0) 。在程序执行过程中当生成一个新串时就从start指示的位置起为新串分配一个所需大小的存储空间同时建立该串的描述。这种存储结构称为堆结构。 此时堆串可定义如下
typedef struct
{int len int start
} HeapString 其中len域指示串的长度 start域指示串的起始位置。借助此结构可以在串名和串值之间建立一个对应关系称为串名的存储映象。系统中所有串名的存储映象构成一个符号表。 在C语言中已经有一个称为“堆”的自由存储空间并可用malloc和free函数完成动态存储管理。因此我们可以直接利用C语言中的“堆”实现堆串。此时堆串可定义如下
typedef struct
{ char * ch int len
} HString 2.基本操作
1.初始化
//初始化
HString * Init_HString( )
{ HString *s; s (HString *) malloc ( sizeof( HString ) );s-len0;s-chNULL;printf(初始化成功。\n);return s;
}
2.录入
//录入
int Enter_SStrin(HString *s)
{char x;
int len;
printf(请输入字符串长度和元素);
scanf(%d %c,len,x);
s-ch(char *) malloc ( len );
while(x!#)
{s-ch[s-len] x; s-lens-len1; scanf( %c,x);
}
printf(录入完成。\n);return 1; /*入队成功函数返回1*/
}
3.插入
//插入
int StrInsert(HString *s,HString t) /* 在串s中序号为pos的字符之前插入串t */
{
int i,pos;
char *temp;
printf(请输入插入位置);
scanf(%d,pos);
if (pos0 || poss-len || s-len0) return(0);
temp(char *)malloc(s-len t.len);
if (tempNULL) return(0);
for (i0;ipos;i) temp[i]s-ch[i];
for (i0;it.len;i) temp[ipos]t.ch[i];
for (ipos;is-len;i) temp[i t.len]s-ch[i];
s-lent.len;
free(s-ch);s-chtemp;
printf(插入成功\n);
return(1);
}
4.删除
//串删除函数
int StrDelete(HString *s) /* 在串s中删除从序号pos起的len个字符 */
{
int i,pos,len;
char *temp;
printf(请输入删除位置和个数);
scanf(%d %d,pos,len);
if (pos0 || pos(s-len - len)) return(0);
temp(char *)malloc(s-len - len);
if (tempNULL) return(0);
for (i0;ipos;i) temp[i]s-ch[i];
for (ipos;is-len - len;i) temp[i]s-ch[ilen];
s-lens-len-len;
free(s-ch);s-chtemp;
printf(删除成功\n);
return(1);
}
5.遍历
//遍历
void Printf(HString *s)
{int i;
for(i0;is-len;i)
{printf(%c,s-ch[i]);
}
printf(\n);
}
6.复制
//串复制函数
int StrCopy(HString *s,HString t) /* 将串t的值复制到串s中 */
{
int i;
s-ch(char *)malloc(t.len);
if (s-chNULL) return(0);
for (i0;it.len;i) s-ch[i]t.ch[i];
s-lent.len;
printf(复制完成。\n);
return(1);
}
7.判空
//判空函数
int StrEmpty(HString s) /* 若串s为空(即串长为0)则返回1否则返回0 */
{
if (s.len0) {printf(堆串为空。\n);return(1);
}
else
printf(堆串不为空。\n);
return(0);
} 8.比较
//串比较函数
int StrCompare(HString s,HString t) /* 若串s和t相等 则返回0 若st 则返回1 若st 则返回-1 */
{
int i;
for (i0;is.lenit.len;i) if (s.ch[i]!t.ch[i]) {if(s.ch[i]- t.ch[i]0)printf(串s和t相等。\n);if(s.ch[i]- t.ch[i]0)printf(串s大于t。\n);if(s.ch[i]- t.ch[i]0)printf(串s小于t。\n);return(s.ch[i] - t.ch[i]);}if(s.len - t.len0)
printf(串s和t相等。\n);
if(s.len - t.len0)
printf(串s大于t。\n);
if(s.len - t.len0)
printf(串s小于t。\n);
return(s.len - t.len);
}
9.求串长
//求串长函数
int StrLength(HString s) /* 返回串s的长度 */
{printf(串长为%d\n,s.len);
return(s.len);
}
10.清空
//清空函数
int StrClear(HString *s) /* 将串s置为空串 */
{
if (s-ch!NULL) free(s-ch);
s-chNULL;
s-len0;
printf(清空完成。\n);
return(1);
}
11.连接
//连接函数
int StrCat(HString *s,HString t) /* 将串t连接在串s的后面 */
{
int i;
char *temp;
temp(char *)malloc(s-len t.len);
if (tempNULL) return(0);
for (i0;is-len;i)temp[i]s-ch[i];
for (is-len;is-len t.len;i) temp[i]t.ch[i-s-len];
s-lent.len;
free(s-ch);s-chtemp;
printf(连接完成。\n);
return(1);
} 12.求子串
//求子串函数
HString *SubString(HString s) /* 将串s中序号pos起的len个字符复制到sub中 */
{
int i,pos,len;
HString *sub; sub (HString *) malloc ( sizeof( HString ) );sub-len0;sub-chNULL;
printf(请输入子串起始位置和子串长度);
scanf(%d %d,pos,len);
if (sub-ch!NULL) free(sub-ch);
if (pos0 || poss.len || len1 || lens.len-pos) { sub-chNULL;sub-len0;printf(子串位置不合法。\n);return(0);}
else { sub-ch(char *)malloc(len); if (sub-chNULL) return(0); for (i0;ilen;i) sub-ch[i]s.ch[ipos]; sub-lenlen; printf(截取子串成功。\n);return(sub); }
}
13.定位
//定位函数
int StrIndex(HString s,HString t) /* 求串t在串s中的位置 */
{
int i, j,pos;
printf(请输入在第几个元素之后进行查找);
scanf(%d,pos);
if (s.len0 || t.len0)
{printf(s或t不存在。\n);return(0);
}
ipos;j0;
while (is.len jt.len){ if (s.ch[i]t.ch[j]) {i;j;} else {ii-j1;j0;}}
if (jt.len)
{printf(串t首在s中的位置为%d\n,i-j);return(i-j);
}
else
printf(未在s中找到t。\n);
return(0);
} 3.代码 #includestdio.h
#includemalloc.htypedef struct
{ char * ch; int len;
} HString; //初始化
HString * Init_HString( )
{ HString *s; s (HString *) malloc ( sizeof( HString ) );s-len0;s-chNULL;printf(初始化成功。\n);return s;
}//录入
int Enter_SStrin(HString *s)
{char x;
int len;
printf(请输入字符串长度和元素);
scanf(%d %c,len,x);
s-ch(char *) malloc ( len );
while(x!#)
{s-ch[s-len] x; s-lens-len1; scanf( %c,x);
}
printf(录入完成。\n);return 1; /*入队成功函数返回1*/
}//遍历
void Printf(HString *s)
{int i;
for(i0;is-len;i)
{printf(%c,s-ch[i]);
}
printf(\n);
}//插入
int StrInsert(HString *s,HString t) /* 在串s中序号为pos的字符之前插入串t */
{
int i,pos;
char *temp;
printf(请输入插入位置);
scanf(%d,pos);
if (pos0 || poss-len || s-len0) return(0);
temp(char *)malloc(s-len t.len);
if (tempNULL) return(0);
for (i0;ipos;i) temp[i]s-ch[i];
for (i0;it.len;i) temp[ipos]t.ch[i];
for (ipos;is-len;i) temp[i t.len]s-ch[i];
s-lent.len;
free(s-ch);s-chtemp;
printf(插入成功\n);
return(1);
} //串删除函数
int StrDelete(HString *s) /* 在串s中删除从序号pos起的len个字符 */
{
int i,pos,len;
char *temp;
printf(请输入删除位置和个数);
scanf(%d %d,pos,len);
if (pos0 || pos(s-len - len)) return(0);
temp(char *)malloc(s-len - len);
if (tempNULL) return(0);
for (i0;ipos;i) temp[i]s-ch[i];
for (ipos;is-len - len;i) temp[i]s-ch[ilen];
s-lens-len-len;
free(s-ch);s-chtemp;
printf(删除成功\n);
return(1);
} //串复制函数
int StrCopy(HString *s,HString t) /* 将串t的值复制到串s中 */
{
int i;
s-ch(char *)malloc(t.len);
if (s-chNULL) return(0);
for (i0;it.len;i) s-ch[i]t.ch[i];
s-lent.len;
printf(复制完成。\n);
return(1);
} //判空函数
int StrEmpty(HString s) /* 若串s为空(即串长为0)则返回1否则返回0 */
{
if (s.len0) {printf(堆串为空。\n);return(1);
}
else
printf(堆串不为空。\n);
return(0);
} //串比较函数
int StrCompare(HString s,HString t) /* 若串s和t相等 则返回0 若st 则返回1 若st 则返回-1 */
{
int i;
for (i0;is.lenit.len;i) if (s.ch[i]!t.ch[i]) {if(s.ch[i]- t.ch[i]0)printf(串s和t相等。\n);if(s.ch[i]- t.ch[i]0)printf(串s大于t。\n);if(s.ch[i]- t.ch[i]0)printf(串s小于t。\n);return(s.ch[i] - t.ch[i]);}if(s.len - t.len0)
printf(串s和t相等。\n);
if(s.len - t.len0)
printf(串s大于t。\n);
if(s.len - t.len0)
printf(串s小于t。\n);
return(s.len - t.len);
} //求串长函数
int StrLength(HString s) /* 返回串s的长度 */
{printf(串长为%d\n,s.len);
return(s.len);
} //清空函数
int StrClear(HString *s) /* 将串s置为空串 */
{
if (s-ch!NULL) free(s-ch);
s-chNULL;
s-len0;
printf(清空完成。\n);
return(1);
} //连接函数
int StrCat(HString *s,HString t) /* 将串t连接在串s的后面 */
{
int i;
char *temp;
temp(char *)malloc(s-len t.len);
if (tempNULL) return(0);
for (i0;is-len;i)temp[i]s-ch[i];
for (is-len;is-len t.len;i) temp[i]t.ch[i-s-len];
s-lent.len;
free(s-ch);s-chtemp;
printf(连接完成。\n);
return(1);
} //求子串函数
HString *SubString(HString s) /* 将串s中序号pos起的len个字符复制到sub中 */
{
int i,pos,len;
HString *sub; sub (HString *) malloc ( sizeof( HString ) );sub-len0;sub-chNULL;
printf(请输入子串起始位置和子串长度);
scanf(%d %d,pos,len);
if (sub-ch!NULL) free(sub-ch);
if (pos0 || poss.len || len1 || lens.len-pos) { sub-chNULL;sub-len0;printf(子串位置不合法。\n);return(0);}
else { sub-ch(char *)malloc(len); if (sub-chNULL) return(0); for (i0;ilen;i) sub-ch[i]s.ch[ipos]; sub-lenlen; printf(截取子串成功。\n);return(sub); }
} //定位函数
int StrIndex(HString s,HString t) /* 求串t在串s中的位置 */
{
int i, j,pos;
printf(请输入在第几个元素之后进行查找);
scanf(%d,pos);
if (s.len0 || t.len0)
{printf(s或t不存在。\n);return(0);
}
ipos;j0;
while (is.len jt.len){ if (s.ch[i]t.ch[j]) {i;j;} else {ii-j1;j0;}}
if (jt.len)
{printf(串t首在s中的位置为%d\n,i-j);return(i-j);
}
else
printf(未在s中找到t。\n);
return(0);
} void menu()
{
printf(--------1.初始化s------\n);
printf(--------2.初始化t------\n);
printf(--------3.录入s--------\n);
printf(--------4.录入t--------\n);
printf(--------5.插入---------\n);
printf(--------6.删除---------\n);
printf(--------7.判空---------\n);
printf(--------8.复制---------\n);
printf(--------9.比较---------\n);
printf(--------10.求长度------\n);
printf(--------11.清空--------\n);
printf(--------12.连接--------\n);
printf(--------13.求子串sub---\n);
printf(--------14.定位-------\n);
printf(--------15.遍历s-------\n);
printf(--------16.遍历t-------\n);
printf(--------17.遍历sub-----\n);
printf(--------18.退出程序----\n);
}int main()
{HString *s,*t,*sub;
int n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,a,quit0;
menu();
while(1)
{
scanf(%d,a);
switch(a)
{
case 1:sInit_HString( );break;
case 2:tInit_HString( );break;
case 3:n1Enter_SStrin(s);break;
case 4:n2Enter_SStrin(t);break;
case 5:n3StrInsert(s,*t);break;
case 6:n4StrDelete(s);break;
case 7:n5StrEmpty(*s);break;
case 8:n6StrCopy(s,*t);break;
case 9:n7StrCompare(*s,*t) ;break;
case 10:n8StrLength(*s);break;
case 11:n9StrClear(s);break;
case 12:n10StrCat(s,*t);break;
case 13:subSubString(*s);break;
case 14:n11StrIndex(*s,*t);break;
case 15:Printf(s);break;
case 16:Printf(t);break;
case 17:Printf(sub);break;
case 18:quit1;break;
default:printf(输入1~18之间的数字\n);break;
}
if(quit1)
{break;
}
}
return 0;}