Пример #1
0
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;
}
Пример #2
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);
}
Пример #4
0
 /* 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;
 }
Пример #5
0
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));
}
Пример #6
0
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;
}
Пример #7
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);
}
Пример #8
0
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);
}
Пример #9
0
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));
}
Пример #10
0
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;
}
Пример #11
0
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;
}
Пример #12
0
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;
}
Пример #13
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未出现过
}
Пример #14
0
 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");
 }
Пример #15
0
 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");
   }
 }
Пример #16
0
 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");
 }
Пример #17
0
 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");
 }
Пример #18
0
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);
}
Пример #19
0
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;
}
Пример #20
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");
 }
Пример #21
0
 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");
 }
Пример #22
0
 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;
 }
Пример #23
0
 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;
 }
Пример #24
0
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; }
}
Пример #25
0
 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
 }
Пример #26
0
 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 */
 }
Пример #27
0
 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;
 }
Пример #28
0
 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);
 }
Пример #29
0
 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);
 }
Пример #30
0
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;
}