| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 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;}}}} |
|
|
回复:数据结构--串 文章收藏
NB(游客)发表评论于2010/1/4 18:24:33 |
|
» 1 »
|