/* 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()
{
	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);
}
Exemple #3
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));
}
 Status Concat(LString *T,LString S1,LString S2)
 { /* 用T返回由S1和S2联接而成的新串 */
   LString a1,a2;
   InitString(&a1);
   InitString(&a2);
   StrCopy(&a1,S1);
   StrCopy(&a2,S2);
   (*T).curlen=S1.curlen+S2.curlen;
   (*T).head=a1.head;
   a1.tail->next=a2.head;
   (*T).tail=a2.tail;
   return OK;
 }
Exemple #5
0
 static Status Concat(LString &T,LString S1,LString S2)
 { // 用T返回由S1和S2联接而成的新串
   LString a1,a2;
   InitString(a1);
   InitString(a2);
   StrCopy(a1,S1);
   StrCopy(a2,S2);
   T.curlen=S1.curlen+S2.curlen;
   T.head=a1.head;
   a1.tail->next=a2.head;
   T.tail=a2.tail;
   return OK;
 }
Exemple #6
0
void TRI_Insert2ObjectJson (TRI_memory_zone_t* zone,
                           TRI_json_t* object,
                           char const* name,
                           TRI_json_t const* subobject) {
  TRI_ASSERT(object->_type == TRI_JSON_OBJECT);

  if (subobject == nullptr) {
    return;
  }

  if (TRI_ReserveVector(&object->_value._objects, 2) != TRI_ERROR_NO_ERROR) {
    // TODO: signal OOM here
    return;
  }

  size_t length = strlen(name);
  char* att = TRI_DuplicateString2Z(zone, name, length);

  if (att == nullptr) {
    // TODO: signal OOM here
    return;
  }

  // create attribute name in place
  TRI_json_t* next = static_cast<TRI_json_t*>(TRI_NextVector(&object->_value._objects));
  // we have made sure above with the reserve call that the vector has enough capacity
  TRI_ASSERT(next != nullptr);
  InitString(next, att, length);

  // attribute value
  TRI_PushBackVector(&object->_value._objects, subobject);
}
Exemple #7
0
void TRI_Insert2ArrayJson (TRI_memory_zone_t* zone,
                           TRI_json_t* object,
                           char const* name,
                           TRI_json_t* subobject) {
  TRI_json_t copy;
  char* att;
  size_t length;

  TRI_ASSERT(object->_type == TRI_JSON_ARRAY);

  if (subobject == NULL) {
    return;
  }

  if (TRI_ReserveVector(&object->_value._objects, 2) != TRI_ERROR_NO_ERROR) {
    // TODO: signal OOM here
    return;
  }

  length = strlen(name);
  att = TRI_DuplicateString2Z(zone, name, length);

  if (att == NULL) {
    // TODO: signal OOM here
    return;
  }

  // attribute name
  InitString(&copy, att, length);
  TRI_PushBackVector(&object->_value._objects, &copy);

  // attribute value
  TRI_PushBackVector(&object->_value._objects, subobject);
}
 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 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 Copy()
 { // 拷贝行
   int i,l,m,k;
   printf("把第l行开始的m行插在原k行之前,请输入l m k: ");
   scanf("%d%d%d",&l,&m,&k);
   if(n+m>MAX_LEN)
   {
     printf("拷贝行太多\n");
     return;
   }
   if(n>=k-1&&n>=l-1+m&&(k>=l+m||k<=l))
   {
     for(i=n-1;i>=k-1;i--)
       T[i+m]=T[i];
     n+=m;
     if(k<=l)
       l+=m;
     for(i=l-1;i<l-1+m;i++)
     {
       InitString(T[i+k-l]);
       StrCopy(T[i+k-l],T[i]);
     }
   }
   else
     printf("行超出范围\n");
 }
Exemple #11
0
int TRI_InitString2CopyJson (TRI_memory_zone_t* zone, TRI_json_t* result, char const* value, size_t length) {
  char* copy = TRI_DuplicateString2Z(zone, value, length);
  if (copy == nullptr) {
    return TRI_ERROR_OUT_OF_MEMORY;
  }
  InitString(result, copy, length);
  return TRI_ERROR_NO_ERROR;
}
 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");
 }
Exemple #13
0
TRI_json_t* TRI_CreateStringJson (TRI_memory_zone_t* zone, char* value, size_t length) {
  TRI_json_t* result = static_cast<TRI_json_t*>(TRI_Allocate(zone, sizeof(TRI_json_t), false));

  if (result != nullptr) {
    InitString(result, value, length);
  }

  return result;
}
 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;
 }
Exemple #15
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;
 }
Exemple #16
0
/*************************************************
	Function: 		main
	Description: 	主函数
	Calls: 			scanf	printf
	Called By:		编译器
	Input: 			无
	Output: 		无
	Return: 		0
*************************************************/
int main(void)
{
	char *p, *q;
	p = MALLOC(char, LEN);
	q = MALLOC(char, LEN);
	printf("input the string:\n");
	InitString(p);
	CpyStr(p, q);
	printf("output the string:\n");
	printf("%s\n", q);
}
 void InsertNewKey(IdxListType *idxlist,int i,HString wd)
 { /* 在索引表idxlist的第i项上插入新关键词wd,并初始化书号索引的链表为空表 */
   int j;
   InitList(&(*idxlist).item[(*idxlist).last+1].bnolist); /* bo2-6.c */
   for(j=(*idxlist).last;j>=i;--j) /* 后移索引项 */
     (*idxlist).item[j+1]=(*idxlist).item[j];
   InitString(&(*idxlist).item[i].key); /* bo4-2.c */
   StrCopy(&(*idxlist).item[i].key,wd); /* 串拷贝插入新的索引项 bo4-2.c */
   InitList(&(*idxlist).item[i].bnolist); /* 初始化书号索引表为空表 bo2-6.c */
   (*idxlist).last++;
 }
Exemple #18
0
int main(void){
	GList L;
	InitGList(L);
	SString S;
	InitString(S,"(123),(12ddfa)");
	CreateGList(L,S);

	printf("\nResult End!\n");
	system("pause");
	return 0;
}
Exemple #19
0
/*************************************************
	Function: 		main
	Description: 	主函数
	Calls: 			scanf	printf
	Called By:		编译器
	Input: 			无
	Output: 		无
	Return: 		0
*************************************************/
int main(void)
{
	int pos;
	char string[100];
	printf("input the string:\n");
	InitString(string);
	if (MirrorStr(string))
		printf("palindrome\n");
	else
		printf("not palindrome\n");
	printf("%s\n", string);
}
Exemple #20
0
TRI_json_t* TRI_CreateString2Json (TRI_memory_zone_t* zone, char* value, size_t length) {
  TRI_json_t* result;

  result = (TRI_json_t*) TRI_Allocate(zone, sizeof(TRI_json_t), false);

  if (result == NULL) {
    return NULL;
  }

  InitString(result, value, length);

  return result;
}
 void InsIdxList(IdxListType *idxlist,int bno)
 { /* 将书号为bno的关键词插入索引表 */
   int i,j;
   Status b;
   HString wd;
   InitString(&wd); /* bo4-2.c */
   for(i=0;i<wdlist.last;i++)
   {
     GetWord(i,&wd);
     j=Locate(idxlist,wd,&b);
     if(!b)
       InsertNewKey(idxlist,j,wd); /* 插入新的索引项 */
     InsertBook(idxlist,j,bno); /* 插入书号索引 */
   }
 }
Exemple #22
0
int TRI_InitStringCopyJson (TRI_memory_zone_t* zone, TRI_json_t* result, char const* value, size_t length) {
  if (value == nullptr) {
    // initial string should be valid
    return TRI_ERROR_INTERNAL;
  }

  char* copy = TRI_DuplicateString2Z(zone, value, length);

  if (copy == nullptr) {
    return TRI_ERROR_OUT_OF_MEMORY;
  }

  InitString(result, copy, length);

  return TRI_ERROR_NO_ERROR;
}
Exemple #23
0
TRI_json_t* TRI_CreateString2CopyJson (TRI_memory_zone_t* zone, char const* value, size_t length) {
  TRI_json_t* result;

  result = (TRI_json_t*) TRI_Allocate(zone, sizeof(TRI_json_t), false);

  if (result == NULL) {
    return NULL;
  }

  InitString(result, TRI_DuplicateString2Z(zone, value, length), length);

  if (result->_value._string.data == NULL) {
    TRI_Free(zone, result);
    return NULL;
  }

  return result;
}
Exemple #24
0
Status Index(HString S, HString T, int pos){
  int len_s, len_t, i;
  HString Sub;
  len_s = StrLength(S);
  len_t = StrLength(T);
  InitString(&Sub);
  if(pos > 0){
    i = pos;
    while(i <= len_s - len_t + 1){
      SubString(&Sub, S, i, len_t);
      if(StrCompare(Sub, T) != 0){
        i++;
      }else{
        return i;
      }
    }
  }
  return 0;
}
 void Delete()
 { // 删除行
   int i,l,m;
   printf("从第l行起删除m行,请输入l m: ");
   scanf("%d%d",&l,&m);
   if(n>=l+m-1&&l>0)
   {
     for(i=l-1+m;i<n;i++)
     {
       free(T[i-m].ch);  
       T[i-m]=T[i];
     }
     for(i=n-m;i<n;i++)
       InitString(T[i]);
     n-=m;
   }
   else
     printf("行超出范围\n");
 }
// func4-1.cpp 与存储结构无关的两个基本操作
int Index(String S, String T, int pos)
{
	int n, m, i;
	String sub;

	InitString(sub);
	if (pos > 0) {
		n = StrLength(S);
		m = StrLength(T);
		i = pos;
		while (i <= n - m + 1) {
			SubString(sub, S, i, m);
			if (StrCompare(sub, T) != 0)
				++i;
			else
				return i;
		}
	}
	return 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);
 }
Exemple #28
0
BOOL CSimpleException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
		PUINT pnHelpContext)
{
	ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));

	if (pnHelpContext != NULL)
		*pnHelpContext = 0;

	// if we didn't load our string (eg, we're a console app)
	// return a null string and FALSE

	if (!m_bInitialized)
		InitString();

	if (m_bLoaded)
		lstrcpyn(lpszError, m_szMessage, nMaxError);
	else
		lpszError[0] = '\0';

	return m_bLoaded;
}
Exemple #29
0
TRI_json_t* TRI_CreateStringCopyJson (TRI_memory_zone_t* zone, char const* value, size_t length) {
  if (value == nullptr) {
    // initial string should be valid...
    return nullptr;
  }

  TRI_json_t* result = static_cast<TRI_json_t*>(TRI_Allocate(zone, sizeof(TRI_json_t), false));

  if (result != nullptr) {
    char* copy = TRI_DuplicateString2Z(zone, value, length);

    if (copy == nullptr) {
      TRI_Free(zone, result);
      return nullptr;
    }

    InitString(result, copy, length);
  }

  return result;
}
Exemple #30
0
void TRI_Insert4ArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char* name, size_t nameLength, TRI_json_t* subobject, bool asReference) {
  TRI_json_t copy;

  TRI_ASSERT(name != NULL);

  // attribute name
  if (asReference) {
    InitStringReference(&copy, name, nameLength);
  }
  else {
    InitString(&copy, name, nameLength);
  }

  if (TRI_ReserveVector(&object->_value._objects, 2) != TRI_ERROR_NO_ERROR) {
    // TODO: signal OOM here
    return;
  }

  TRI_PushBackVector(&object->_value._objects, &copy);

  // attribute value
  TRI_PushBackVector(&object->_value._objects, subobject);
}