int main() { SString s; StrAssign(s,"acabaabaabcacaabc"); SString t; StrAssign(t,"abaabcac"); StrPrint(s); StrPrint(t); int next[10]; get_next(t,next); SString v; StrAssign(v,"xy"); if(Replace(s,t,v)) StrPrint(s); if(Reverse(v)) StrPrint(v); int cnt[10]; if(Count(s,v,cnt)){ StrPrint(v); for(int i=0; i<=v[0]; i++) printf("%d ",cnt[i]); } return 0; }
/* bo5-51.c 广义表的书写形式串为SString类型 */ #include "../ch4/c4-1.h" /* 定义SString类型 */ #include "../ch4/bo4-1.c" /* SString类型的基本操作 */ void sever(SString str,SString hstr) /* 算法5.8 SString是数组,不需引用类型 */ { /* 将非空串str分割成两部分:hsub为第一个','之前的子串,str为之后的子串 */ int n,k,i; /* k记尚未配对的左括号个数 */ SString ch,c1,c2,c3; n=StrLength(str); StrAssign(c1,","); StrAssign(c2,"("); StrAssign(c3,")"); SubString(ch,str,1,1); for(i=1,k=0;i<=n&&StrCompare(ch,c1)||k!=0;++i) { /* 搜索最外层的第一个逗号 */ SubString(ch,str,i,1); if(!StrCompare(ch,c2)) ++k; else if(!StrCompare(ch,c3)) --k; } if(i<=n) { SubString(hstr,str,1,i-2); SubString(str,str,i,n-i+1); } else { StrCopy(hstr,str); ClearString(str); } }
void TEST01_Sqstr_main() { SqString s, s1, s2, s3, s4; printf("(1)建立串s和串s1\n"); StrAssign(s, "abcdefghefghijklmn"); StrAssign(s1, "xyz"); printf("(2)输出串s:"); DispStr(s); printf("(3)串s的长度:%d\n", StrLength(s)); printf("(4)在串s的第9个字符位置插入串s1而产生串s2\n"); s2 = InsStr(s, 9, s1); printf("(5)输出串s2:"); DispStr(s2); printf("(6)删除串s第2个字符开始的5个字符而产生串s2\n"); s2 = DelStr(s, 2, 5); printf("(7)输出串s2:"); DispStr(s2); printf("(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n"); s2 = RepStr(s, 2, 5, s1); printf("(9)输出串s2:"); DispStr(s2); printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n"); s3 = SubStr(s, 2, 10); printf("(11)输出串s3:"); DispStr(s3); printf("(12)将串s1和串s2连接起来而产生串s4\n"); s4 = Concat(s1, s2); printf("(13)输出串s4:"); DispStr(s4); }
/* bo5-52.c 广义表的书写形式串为HString类型 */ #include"c4-2.h" /* 定义HString类型 */ #include"bo4-2.c" /* HString类型的基本操作 */ Status sever(HString *str,HString *hstr) { /* 将非空串str分割成两部分:hstr为第一个','之前的子串,str为之后的子串 */ int n,i=1,k=0; /* k记尚未配对的左括号个数 */ HString ch,c1,c2,c3; InitString(&ch); /* 初始化HString类型的变量 */ InitString(&c1); InitString(&c2); InitString(&c3); StrAssign(&c1,","); StrAssign(&c2,"("); StrAssign(&c3,")"); n=StrLength(*str); do { SubString(&ch,*str,i,1); if(!StrCompare(ch,c2)) ++k; else if(!StrCompare(ch,c3)) --k; ++i; }while(i<=n&&StrCompare(ch,c1)||k!=0); if(i<=n) { StrCopy(&ch,*str); SubString(hstr,ch,1,i-2); SubString(str,ch,i,n-i+1); } else { StrCopy(hstr,*str); ClearString(str); } return OK; }
void main() { SqString s,t; StrAssign(s,"ababcabcacbab"); StrAssign(t,"abcac"); printf("s:");DispStr(s); printf("t:");DispStr(t); printf("位置:%d\n",KMPIndex1(s,t)); }
int main() { StrPtr s, t, v; StrAssign(s, "aaaabb"); StrPrint(s); StrAssign(t, "ccdd"); if(Concat(v,s,t)) StrPrint(v); if(SubString(v,s,2,4)) StrPrint(v); return 0; }
void main() { int i; char c, *p = "God bye!", *q = "God luck!"; HString t, s, r; InitString(t); InitString(s); InitString(r); StrAssign(t, p); printf("串t为"); StrPrint(t); printf("串长为%d,串空否?%d(1:空 0:否)\n", StrLength(t), StrEmpty(t)); StrAssign(s, q); printf("串s为"); StrPrint(s); i = StrCompare(s, t); if (i < 0) c = '<'; else if (i == 0) c = '='; else c = '>'; printf("串s%c串t\n", c); Concat(r, t, s); printf("串t连接串s产生的串r为"); StrPrint(r); StrAssign(s, "oo"); printf("串s为"); StrPrint(s); StrAssign(t, "o"); printf("串t为"); StrPrint(t); Replace(r, t, s); printf("把串r中和串t相同的子串用串s代替后,串r为"); StrPrint(r); ClearString(s); printf("串s清空后,串长为%d,空否?%d(1:空 0:否)\n", StrLength(s), StrEmpty(s)); SubString(s, r, 6, 4); printf("串s为从串r的第6个字符起的4个字符,长度为%d,串s为", s.length); StrPrint(s); StrCopy(t, r); printf("由串r复制得串t,串t为"); StrPrint(t); StrInsert(t, 6, s); printf("在串t的第6个字符前插入串s后,串t为"); StrPrint(t); StrDelete(t, 1, 5); printf("从串t的第1个字符起删除5个字符后,串t为"); StrPrint(t); printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 1)); printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 2)); DestroyString(t); }
void test() { char ch[2][255]; int i=0,pos=1; SString S[2],T; for(i=0;i<2;i++) { printf("ÊäÈë×Ö·û´®%d:",i+1); scanf("%s",ch[i]); StrAssign(S[i],ch[i]); } for(i=0;i<2;i++) { printf("Êä³ö×Ö·û´®%d:",i+1); StrPrint(S[i]); printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i])); } printf("---Á¬½Ó´®--\n"); Concat(T,S[0],S[1]); printf("Á¬½Óºó:"); StrPrint(T); printf("---Çó×Ó´®---\n"); printf("ÊäÈë×Ö´®:"); scanf("%s",ch[0]); printf("ÊäÈë²éÕÒλÖÃ:"); scanf("%d",&pos); StrAssign(S[0],ch[0]); i=Index(T,S[0],pos); printf("²éÕÒµ½µÄλÖÃ:%d\n",i); printf("---Ìæ´ú---\n"); printf("ÊäÈëÌæ´úµÄ×Ó´®:"); scanf("%s",ch[1]); printf("Ìæ»»%sºó:",ch[0]); StrAssign(S[1],ch[1]); Replace(T,S[0],S[1]); StrPrint(T); printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2); StrCopy(S[0],S[1]); printf("---¸´Öƺó---\n"); for(i=0;i<2;i++) { printf("Êä³ö×Ö·û´®%d:",i+1); StrPrint(S[i]); printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i])); } printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2); }
void main() { int i; char c,*p="God bye!",*q="God luck!"; HString t,s,r; InitString(&t); /* HString类型必需初始化 */ InitString(&s); InitString(&r); StrAssign(&t,p); printf("串t为: "); StrPrint(t); printf("串长为%d 串空否?%d(1:空 0:否)\n",StrLength(t),StrEmpty(t)); StrAssign(&s,q); printf("串s为: "); StrPrint(s); i=StrCompare(s,t); if(i<0) c='<'; else if(i==0) c='='; else c='>'; printf("串s%c串t\n",c); Concat(&r,t,s); printf("串t联接串s产生的串r为: "); StrPrint(r); StrAssign(&s,"oo"); printf("串s为: "); StrPrint(s); StrAssign(&t,"o"); printf("串t为: "); StrPrint(t); Replace(&r,t,s); printf("把串r中和串t相同的子串用串s代替后,串r为:\n"); StrPrint(r); ClearString(&s); printf("串s清空后,串长为%d 空否?%d(1:空 0:否)\n",StrLength(s),StrEmpty(s)); SubString(&s,r,6,4); printf("串s为从串r的第6个字符起的4个字符,长度为%d 串s为: ",s.length); StrPrint(s); StrCopy(&t,r); printf("复制串t为串r,串t为: "); StrPrint(t); StrInsert(&t,6,s); printf("在串t的第6个字符前插入串s后,串t为: "); StrPrint(t); StrDelete(&t,1,5); printf("从串t的第1个字符起删除5个字符后,串t为: "); StrPrint(t); printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n",Index(t,s,1)); printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n",Index(t,s,2)); }
void Insert() { int l, m; int i; printf("input lines input and line No. m insert to :"); scanf("%d,%d", &l, &m); if (l+m>MAX_LEN || l <= 0) { printf("invalid insert lines\n"); return; } for (i=n;i>=l;i--) { T[i+m] = T[i]; } printf("input the lines: \n"); while (m > 0) { // fgets(str, fp); // scanf("%s", str); gets(str); ClearString(&T[l]); StrAssign(&T[l], str); l++; } n+=m; }
void Create(GList1 &L, SString S) { SString emp, sub, hsub; GList1 p; StrAssign(emp, "()"); if (!(L = (GList1)malloc(sizeof(GLNode1)))) exit(OVERFLOW); if (!StrCompare(S, emp)) { L->tag = LIST; L->hp = NULL; } else if (StrLength(S) == 1) { L->tag = ATOM; L->atom = S[1]; } else { L->tag = LIST; SubString(sub, S, 2, StrLength(S) - 2); sever(sub, hsub); Create(L->hp, hsub); p = L->hp; while (!StrEmpty(sub)) { sever(sub, hsub); Create(p->tp, hsub); p = p->tp; } } L->tp = NULL; }
int main() { char cmd[MAXCMD]={0}; // Commande int ret; // Le retour de la fonctions String S[MAXLEN]={0},*p; //S:String p:Pointeur à String char tmp[MAXLEN]={0}; printf("***********************************************\n"); printf("------ Première implementaion du String ------\n"); printf("La maxime longeur du string: %d\n",MAXLEN); printf("Options de commandes: \n"); printf("0: StrAssign \n"); printf("1: StrLength \n"); printf("2: StrPrint \n"); printf("#: Quit \n"); printf("***********************************************\n"); while (1) { scanf("%s",cmd);// Lire la commande if (cmd[0]=='#') break; // Quiter if (!CharsCompare(cmd,"0\0")) { scanf("%s",tmp); // La valeur initial p=&S[0]; ret=StrAssign(p,tmp); } else if (!CharsCompare(cmd,"1\0")) { p=&S[0]; ret=StrLength(*p); printf("length is %d.\n",ret); ret=OK; } else if (!CharsCompare(cmd,"2\0")) { p=&S[0]; ret=StrPrint(*p); } else { printf("The Command is Error.\n"); } if (ret==OK) printf("This Command is Successful.\n\n"); else if (ret==ERROR) printf("The input data is Error.\n\n"); else if (ret==OVERFLOW) printf("OVERFLOW.\n\n"); } return 0; }
Status Replace(SString& S, SString T, SString V){ //入口断言:S,T,V存在 //操作结果:将S中出现的所有不重复的T都替换为V int k = Index(S, T, 1); if(k){ SString suffix; StrAssign(suffix,""); int n = T[0], m = S[0]; while(k){ printf("%d\n",k); SString temp; SubString(temp, S, 1, k-1); //当前第一个T的前缀 StrPrint(temp); if(Concat(suffix, temp)){ StrPrint(suffix); Concat(suffix, V); //追加上V StrPrint(suffix); m -= (k-1)+n; //处理掉上一组后剩余的后缀长度 SubString(temp, S, k+n, m); StrCopy(S, temp); //S被截断为尚未处理的后缀 k = Index(S, T, 1); }else return OVERFLOW; //S空间不足 } if(Concat(suffix, S)){ StrCopy(S, suffix); return OK; }else return OVERFLOW; } else return OK; //T未出现过 }
void Search() { // 查找字符串 int i,k,f=1; // f为继续查找标志 char b[2]; HString s; printf("请输入待查找的字符串: "); scanf("%s%*c",str); InitString(s); StrAssign(s,str); for(i=0;i<n&&f;i++) // 逐行查找 { k=1; // 由每行第1个字符起查找 while(k) { k=Index(T[i],s,k); // 由本行的第k个字符开始查找 if(k) // 找到 { printf("第%d行: ",i+1); StrPrint(T[i]); printf("第%d个字符处找到。继续查找吗(Y/N)? ",k); gets(b); if(b[0]!='Y'&&b[0]!='y') // 中断查找 { f=0; break; } else k++; } } } if(f) printf("没找到\n"); }
void Open() { // 打开文件(新或旧) if(filename[0]) // 文件已打开 printf("已存在打开的文件\n"); else { printf("请输入文件名(可包括盘符、路径,不超过%d个字符): ",NAME_LEN-1); scanf("%s",filename); fp=fopen(filename,"r"); // 以读的方式打开文件 if(fp) // 已存在此文件 { while(fgets(str,LINE_LEN,fp)) // 由文件读入1行字符成功 { str[strlen(str)-1]=0; // 将换行符10强制改为串结束符0 if(n>=MAX_LEN) { printf("文件太大\n"); return; } StrAssign(T[n],str); n++; } fclose(fp); // 关闭文件 } else printf("新文件\n"); } }
void Insert() { // 插入行 int i,l,m; printf("在第l行前插m行,请输入l m: "); scanf("%d%d%*c",&l,&m); if(n+m>MAX_LEN) { printf("插入行太多\n"); return; } if(n>=l-1&&l>0) { for(i=n-1;i>=l-1;i--) T[i+m]=T[i]; n+=m; printf("请顺序输入待插入内容:\n"); for(i=l-1;i<l-1+m;i++) { gets(str); InitString(T[i]); StrAssign(T[i],str); } } else printf("行超出范围\n"); }
void Replace() { // 替换字符串 int i,k,f=1; // f为继续替换标志 char b[2]; HString s,t; printf("请输入待替换的字符串: "); scanf("%s%*c",str); InitString(s); StrAssign(s,str); printf("替换为: "); scanf("%s%*c",str); InitString(t); StrAssign(t,str); for(i=0;i<n&&f;i++) // 逐行查找、替换 { k=1; // 由每行第1个字符起查找 while(k) { k=Index(T[i],s,k); // 由本行的第k个字符开始查找 if(k) // 找到 { printf("第%d行: ",i+1); StrPrint(T[i]); printf("第%d个字符处找到。是否替换(Y/N)? ",k); gets(b); if(b[0]=='Y'||b[0]=='y') { StrDelete(T[i],k,StrLength(s)); StrInsert(T[i],k,t); } printf("继续替换吗(Y/N)?"); gets(b); if(b[0]!='Y'&&b[0]!='y') // 中断查找、替换 { f=0; break; } else k+=StrLength(t); } } } if(f) printf("没找到\n"); }
int main(int argc,char *argv[]) { HString H,T,Sub,S; char str[]="123456"; char arr[]="12345678"; StrAssign(&H,str); StrAssign(&T,arr); PrintStr(H); printf("\n"); PrintStr(T); printf("\n"); printf("Length:%d,compare:%d\n",StrLength(H),StrCompare(H,T)); SubString(&Sub,H,2,3); PrintStr(Sub); printf("\n"); StrConcat(&S,H,T); printf("\n"); PrintStr(S); }
int main(void) { LiString * s, * t, * pro; char sstr[] = "another"; char tstr[] = "home"; StrAssign(t, tstr); printf("Prediction: home\n"); DispStr(t); StrCopy(s, t); printf("Prediction: home\n"); DispStr(s); printf("Prediction: Equal!\n"); StrEqual ? printf("Equal!\n") : printf("Not equal!\n"); printf("Prediction: Length: 4\n"); printf("Length: %d\n", StrLength(t)); StrAssign(s, sstr); pro = Concat(s, t); printf("Prediction: anotherhome\n"); DispStr(pro); return 0; }
void ALGO4_1_main() { int i,j,*p; SString s1,s2; // 以教科书中图4.5为例 StrAssign(s1,"acabaabaabcacaabc"); printf("主串为: "); StrPrint(s1); StrAssign(s2,"abaabcac"); printf("子串为: "); StrPrint(s2); i=StrLength(s2); p=(int*)malloc((i+1)*sizeof(int)); // 生成s2的next数组 get_next(s2,p); printf("子串的next函数为: "); for(j=1;j<=i;j++) printf("%d ",*(p+j)); printf("\n"); i=Index_KMP(s1,s2,1,p); if(i) printf("主串和子串在第%d个字符处首次匹配\n",i); else printf("主串和子串匹配不成功\n"); }
void Modify() { // 修改行 int i; printf("请输入待修改的行号: "); scanf("%d%*c",&i); if(i>0&&i<=n) // 行号合法 { printf("%d: ",i); StrPrint(T[i-1]); printf("请输入新内容: "); gets(str); StrAssign(T[i-1],str); } else printf("行号超出范围\n"); }
Status CreateGList(GList *L,HString S) { /* 采用头尾链表存储结构,由广义表的书写形式串S创建广义表L。设emp="()" */ HString emp,sub,hsub; GList p,q; InitString(&emp); InitString(&sub); InitString(&hsub); StrAssign(&emp,"()"); if(!StrCompare(S,emp)) /* 创建空表 */ *L=NULL; else { *L=(GList)malloc(sizeof(GLNode)); if(!*L) /* 建表结点不成功 */ exit(OVERFLOW); if(StrLength(S)==1) /* 创建单原子广义表 */ { (*L)->tag=ATOM; (*L)->a.atom=S.ch[0]; } else { (*L)->tag=LIST; p=*L; SubString(&sub,S,2,StrLength(S)-2); /* 脱外层括号 */ do /* 重复建n个子表 */ { sever(&sub,&hsub); /* 从sub中分离出表头串hsub */ CreateGList(&p->a.ptr.hp,hsub); q=p; if(!StrEmpty(sub)) /* 表尾不空 */ { p=(GList)malloc(sizeof(GLNode)); if(!p) exit(OVERFLOW); p->tag=LIST; q->a.ptr.tp=p; } }while(!StrEmpty(sub)); q->a.ptr.tp=NULL; } } return OK; }
Status CreateGList(GList &L,HString S) { // 采用头尾链表存储结构,由广义表的书写形式串S创建广义表L。设emp="()" HString emp,sub,hsub; GList p,q; InitString(emp); InitString(sub); InitString(hsub); StrAssign(emp,"()"); if(!StrCompare(S,emp)) // 创建空表 L=NULL; else { if(!(L=(GList)malloc(sizeof(GLNode)))) // 建表结点不成功 exit(OVERFLOW); if(StrLength(S)==1) // 创建单原子广义表 { L->tag=ATOM; L->atom=S.ch[0]; } else { L->tag=LIST; p=L; SubString(sub,S,2,StrLength(S)-2); // 脱外层括号 do // 重复建n个子表 { sever(sub,hsub); // 从sub中分离出表头串hsub CreateGList(p->ptr.hp,hsub); q=p; if(!StrEmpty(sub)) // 表尾不空 { if(!(p=(GList)malloc(sizeof(GLNode)))) exit(OVERFLOW); p->tag=LIST; q->ptr.tp=p; } }while(!StrEmpty(sub)); q->ptr.tp=NULL; } } return OK; }
void CreateGList(GList1 &L, SString S) { SString emp, sub, hsub; GList1 p; StrAssign(emp, "()"); if (!StrCompare(S, emp)) { InitGList(L); } else { SubString(sub, S, 2, StrLength(S) - 2); sever(sub, hsub); Create(L->hp, hsub); p = L->hp; while (!StrEmpty(sub)) { sever(sub, hsub); Create(p->tp, hsub); p = p->tp; } p->tp = NULL; } }
static void Zip(LString &S) { // 压缩串(清除块中不必要的填补空余的字符)。加 int j,n=0; Chunk *h=S.head; char *q; q=(char*)malloc((S.curlen+1)*sizeof(char)); while(h) // 将LString类型的字符串转换为char[]类型的字符串 { for(j=0;j<CHUNKSIZE;j++) if(*(h->ch+j)!=blank) { *(q+n)=*(h->ch+j); n++; } h=h->next; } *(q+n)=0; // 串结束符 ClearString(S); // 清空S StrAssign(S,q); // 重新生成S }
void Zip(LString *S) { /* 压缩串(清除块中不必要的填补空余的字符)。加 */ int j,n=0; Chunk *h=(*S).head; char *q; q=(char*)malloc(((*S).curlen+1)*sizeof(char)); while(h) /* 将LString类型的字符串转换为char[]类型的字符串 */ { for(j=0;j<CHUNKSIZE;j++) if(*(h->ch+j)!=blank) { *(q+n)=*(h->ch+j); n++; } h=h->next; } *(q+n)=0; /* 串结束符 */ ClearString(S); /* 清空S */ StrAssign(S,q); /* 重新生成S */ }
Status CreateGList(GList *L,SString S) /* 算法5.7 */ { /* 采用头尾链表存储结构,由广义表的书写形式串S创建广义表L。设emp="()" */ SString sub,hsub,emp; GList p,q; StrAssign(emp,"()"); if(!StrCompare(S,emp)) *L=NULL; /* 创建空表 */ else { *L=(GList)malloc(sizeof(GLNode)); if(!*L) /* 建表结点 */ exit(OVERFLOW); if(StrLength(S)==1) /* S为单原子 */ { (*L)->tag=ATOM; (*L)->a.atom=S[1]; /* 创建单原子广义表 */ } else { (*L)->tag=LIST; p=*L; SubString(sub,S,2,StrLength(S)-2); /* 脱外层括号 */ do { /* 重复建n个子表 */ sever(sub,hsub); /* 从sub中分离出表头串hsub */ CreateGList(&p->a.ptr.hp,hsub); q=p; if(!StrEmpty(sub)) /* 表尾不空 */ { p=(GLNode *)malloc(sizeof(GLNode)); if(!p) exit(OVERFLOW); p->tag=LIST; q->a.ptr.tp=p; } }while(!StrEmpty(sub)); q->a.ptr.tp=NULL; } } return OK; }
void main() { char p[80]; GList l,m; HString t; /* 与main5-51.c不同 */ InitString(&t); /* 增加此句 */ InitGList(&l); InitGList(&m); printf("空广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("请输入广义表l(书写形式:空表:(),单原子:a,其它:(a,(b),b)):\n"); gets(p); StrAssign(&t,p); CreateGList(&l,t); printf("广义表l的长度=%d\n",GListLength(l)); printf("广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("遍历广义表l:\n"); Traverse_GL(l,visit); printf("\n复制广义表m=l\n"); CopyGList(&m,l); printf("广义表m的长度=%d\n",GListLength(m)); printf("广义表m的深度=%d\n",GListDepth(m)); printf("遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetHead(l); printf("\nm是l的表头,遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetTail(l); printf("\nm是l的表尾,遍历广义表m:\n"); Traverse_GL(m,visit); InsertFirst_GL(&m,l); printf("\n插入l为m的表头,遍历广义表m:\n"); Traverse_GL(m,visit); printf("\n删除m的表头,遍历广义表m:\n"); DestroyGList(&l); DeleteFirst_GL(&m,&l); Traverse_GL(m,visit); printf("\n"); DestroyGList(&m); }
void main() { char p[80]; SString t; GList l,m; InitGList(&l); InitGList(&m); printf("空广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("请输入广义表l(书写形式:空表:(),单原子:(a),其它:(a,(b),c)):\n"); gets(p); StrAssign(t,p); CreateGList(&l,t); printf("广义表l的长度=%d\n",GListLength(l)); printf("广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("遍历广义表l:\n"); Traverse_GL(l,visit); printf("\n复制广义表m=l\n"); CopyGList(&m,l); printf("广义表m的长度=%d\n",GListLength(m)); printf("广义表m的深度=%d\n",GListDepth(m)); printf("遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetHead(l); printf("\nm是l的表头元素,遍历m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetTail(l); printf("\nm是由l的表尾形成的广义表,遍历广义表m:\n"); Traverse_GL(m,visit); InsertFirst_GL(&m,l); printf("\n插入广义表l为m的表头,遍历广义表m:\n"); Traverse_GL(m,visit); printf("\n删除m的表头,遍历广义表m:\n"); DestroyGList(&l); DeleteFirst_GL(&m,&l); Traverse_GL(m,visit); printf("\n"); DestroyGList(&m); }
Status SubString(HString *sub, HString str, int position, int length) { int i, n; char *p; Status status; if (position < 0 || position >= str.len || length < 0) return ERROR; if (!sub) return ERROR; p = (char*)malloc(sizeof(char)*length + 1); if (!p) return OVERFLOW; n = 0; for (i = position; i < position + length; ++i) { p[n++] = str.ch[i]; } p[n] = '\0'; status = StrAssign(sub, p); if (status != OK) return status; free(p); return OK; }