/* 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); }
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; }
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; }
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); }
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(©, att, length); TRI_PushBackVector(&object->_value._objects, ©); // 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"); }
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"); }
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; }
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; }
/************************************************* 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++; }
int main(void){ GList L; InitGList(L); SString S; InitString(S,"(123),(12ddfa)"); CreateGList(L,S); printf("\nResult End!\n"); system("pause"); return 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); }
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); /* 插入书号索引 */ } }
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; }
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; }
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); }
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; }
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; }
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(©, name, nameLength); } else { InitString(©, name, nameLength); } if (TRI_ReserveVector(&object->_value._objects, 2) != TRI_ERROR_NO_ERROR) { // TODO: signal OOM here return; } TRI_PushBackVector(&object->_value._objects, ©); // attribute value TRI_PushBackVector(&object->_value._objects, subobject); }