本站首页    管理页面    写新日志    退出


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:32
评论数量:44
留言数量:0
访问次数:180577
建立时间:2005年1月4日




数据结构--串
文章收藏

eaglebetter 发表于 2006/8/6 0:23:35

 5-1-2  串的输入与输出1.字符串的输入(1) 使用scanf () 函数char str[10];printf("Input your str: ");scanf("%s",str);(2) 使用gets() 函数char str[10];printf("Input your str: ");gets(str);2.字符串的输出(1) 使用printf () 函数printf("Your str is %s",str);(2) 使用puts () 函数printf("Your str is ");puts (str);5-1-3  串的基本运算1.求串长LenStr(s)2.串连接ConcatStr(s1,s2)3.求子串SubStr (s,i,len): 4.串比较EqualStr (s1,s2)5.子串查找IndexStr (s,t)IndexStr ("abcdebda","bc")=2IndexStr ("abcdebda","ba")=06.串插入 InsStr (s,t,i)7.串删除 DelStr(s,i,len)5-2  串的表示和实现5-2-1  定长顺序存储1.定长存储的描述#define  MAXLEN  100   typedef  Struct {  char  vec[MAXLEN];int  len;                } Str ;                // 可用Str来定义该类型的结构体变量2.存储方式5-2-2  链接存储1.链接存储的描述2.串的存储密度3.大结点结构5-2-3  串的堆分配存储结构1.堆分配存储的方法2.索引存储的例子3.带长度的索引表的描述typedef  Struct {  char  name[MAXLEN];           // 串名int   length;                    // 串长char  *Start;                    // 起始地址} LNode;4.“堆”的管理5-3  串的基本运算#define MAXLEN 100              // 定义串的最大长度typedef  struct {  char  vec[MAXLEN];int   len;                        // 串的实际长度}Str ;                             // 定义一个结构体类型Str1.求串的长度int LenStr (Str *r){ while(r->vec[i]!='\0')i++;return i;}2.串连接void ConcatStr(Str *r1,Str *r2){ if(r1->len+r2->len>MAXLEN)          // 连接后的串长超过串的最大长度  printf("两个串太长,溢出!");  else  { for(i=0;i<r2->len;i++)r1->vec[r1->len+i]=r2->vec[i];       // 进行连接r1->vec[r1->len+i]='\0';r1->len=r1->len+r2->len;           // 修改连接后新串的长度  }}3.求子串void SubStr(Str *r,int i,int j){ if (i+j-1>r->len)  { printf("子串超界!");    return;  } else { for (k=0;k<j;k++)r1->vec[k]=r->vec[i+k-1];           // 从r中取出子串r1->len=j;r1->vec[r1->len]='\0'; }        printf("取出字符为:");puts(r1->vec);}4.串相等的比较int EqualStr (Str *r1, Str *r2){ for (int i=0;r1->vec[i]==r2->vec[i]&&r1->vec[i];i++);   return r1->vec[i]-r2->vec[i];         // 相等返回0} 5.插入子串str *InsStr (Str *r, Str *r1,int i){   if (i>=r->len||r->len+r1->len>MAXLEN)printf ("不能插入!");else{ for (k=r->len-1;k>=i;k--)  r->vec[r1->len+k]=r->vec[k]; // 后移空出位置  for (k=0;k<r1->len;k++)  r->vec[i+k]=r1->vec[k];        // 插入子串r1  r->len=r->len+r1->len;  r->vec[r->len]='\0';    }return r;}6.删除子串void DelStr(Str *r,int i,int j)   // i为指定删除的位置,j为连续删除的字符个数{ if(i+j-1>r->len)printf ("所要删除的子串超界!");else{ for (k=i+j;k<r->len;k++,i++)r->vec[i]=r->vec[k];           // 将后面的字符串前移覆盖  r->len=r->len-j;  r->vec[r->len]='\0';}}7.模式匹配(1) 基本思想:模式匹配的例子(3) 算法描述:int IndexStr(Str *r, Str *r1){ int i,j,k;for(i=0;r->vec[i];i++)for(j=i,k=0;r->vec[j]==r1->vec[k];j++,k++)if(!r1->vec[k+1])return i;return -1;}(4) 时间复杂度分析小结实验5  串子系统1.实验目的2.实验内容3.参考程序#include <stdio.h>#define MAXLEN 100typedef Struct{ char vec[MAXLEN];int len;}Str;void ConcatStr(Str *s1,Str *s2){ int i;printf("s1=%s    s2=%s\n",s1->vec,s2->vec);if(s1->len+s2->len>MAXLEN)printf("\n\t\t两个串太长,溢出!\n");else{ for(i=0;i<s2->len;i++)s1->vec[s1->len+i]=s2->vec[i];s1->vec[s1->len+i]='\0';s1->len=s1->len+s2->len;}}void SubStr(Str *s,int i,int j){ int k;Str a;Str *s1=&a;if(i+j-1>s->len){ printf("\n\t\t子串超界!\n");return;}else{ for(k=0;k<j;k++)s1->vec[k]=s->vec[i+k-1];s1->len=j;s1->vec[s1->len]='\0';}printf("\n\t\t取出字符为:");puts(s1->vec);}void DelStr(Str *s,int i,int j){ int k;if(i+j-1>s->len)printf("\n\t\t所要删除的子串超界!\n");else{ for(k=i+j;k<s->len;k++,i++)s->vec[i]=s->vec[k];s->len=s->len-j;s->vec[s->len]='\0';}}Str *InsStr(Str *s,Str *s1,int i){ int k;if(i>=s->len||s->len+s1->len>MAXLEN)printf("\n\t\t不能插入!\n");else{ for(k=s->len-1;k>=i;k--)s->vec[s1->len+k]=s->vec[k];for(k=0;k<s1->len;k++)s->vec[i+k]=s1->vec[k];s->len=s->len+s1->len;s->vec[s->len]='\0';}return s;}int IndexStr(Str *s,Str *s1){ int i,j,k;for(i=0;s->vec[i];i++)for(j=i,k=0;s->vec[j]==s1->vec[k];j++,k++)if(!s1->vec[k+1])return i;return -1;}int LenStr(Str *s){ int i=0;while(s->vec[i]!='\0')i++;return i;}Str *CseateStr(Str *s){ gets(s->vec);s->len=LenStr(s);return s;}int EqualStr(Str *s1,Str *s2){ for(int i=0;s1->vec[i]==s2->vec[i]&&s1->vec[i];i++);return s1->vec[i]-s2->vec[i];}void main()                                   // 串子系统主函数{ Str a,b,c,d;Str *s=&a,*s1;s->vec[0]='\0';char choice,p;int i,j,ch=1;while(ch!=0){ printf("\n");printf("\n");printf("\n");printf("\n");printf("\n\t\t\t\t串 子 系 统 \n");printf("\n\t\t***************************************");printf("\n\t\t*           1----------输  入  字  串            *");printf("\n\t\t*           2----------连  接  字  串            *");printf("\n\t\t*           3----------取  出  子  串            *");printf("\n\t\t*           4----------删  除  子  串            *");printf("\n\t\t*           5----------插  入  子  串            *");printf("\n\t\t*           6----------查  找  子  串            *");printf("\n\t\t*           7----------比 较 串 大 小            *");printf("\n\t\t*           8----------显  示  字  串            *");printf("\n\t\t*           0----------返          回            *");printf("\n\t\t***************************************");printf("\n\t\t请输入菜单号(0--8):");scanf("%c",&choice);getchar();printf("\n");printf("\n");if (choice=='1'){ printf("\n\t\t请输入一个字符串:");gets(s->vec);s->len=LenStr(s);}else if (choice=='2'){printf("\n\t\t请输入所要连接的串:");s1=CseateStr(&b);ConcatStr(s,s1);}else if (choice=='3'){ printf("\n\t\t请输入从第几个字符开始:");scanf("%d",&i);getchar();printf("\n\t\t请输入取出的连续字符数:");scanf("%d",&j);getchar();SubStr(s,i,j);}else if (choice=='4'){ printf("\n\t\t请输入从第几个字符开始:");scanf("%d",&i);getchar();printf("\n\t\t请输入删除的连续字符数:");scanf("%d",&j);getchar();DelStr(s,i-1,j);}else if (choice=='5'){ printf("\n\t\t请输入在第几个字符前插入:");scanf("%d",&i);getchar();printf("\n\t\t请输入所要插入的字符串:");s1=CseateStr(&b);InsStr(s,s1,i-1);}else if (choice=='6'){ printf("\n\t\t请输入所要查找的字符串:");s1=CseateStr(&b);i=IndexStr(s,s1);if(i!=-1)printf ("\n\t\t第一次出现的位置是第%d个。\n",i+1);elseprintf ("\n\t\t该子串不在其中!\n");}else if(choice=='7'){ printf("\n\t\t请输入第一个串:");gets(c.vec);printf("\n\t\t请输入第二个串:");gets(d.vec);int k=EqualStr(&c,&d);if(k>0)printf("\n\t\t第一个串大!");else if(k<0)printf("\n\t\t第二个串大!");elseprintf("\n\t\t一样大!");}else if (choice=='8'){ printf ("\n\t\t该串值为:");if(s->vec[0]=='\0')printf("空!");elseputs(s->vec);}else if (choice=='0')bseak;elseprintf ("\n\t\t\t***请注意:输入有误!***\n");if (choice!='X'&&choice!='X'){ printf ("\n\n\t\t按回车键继续,按任意键返回主菜单.\n");p=getchar();if(p!='\xA'){getchar();bseak;}}}}


阅读全文(3760) | 回复(1) | 编辑 | 精华
 


回复:数据结构--串
文章收藏

NB(游客)发表评论于2010/1/4 18:24:33



个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144806516 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号