欢迎来到天天文库
浏览记录
ID:14197146
大小:49.00 KB
页数:20页
时间:2018-07-26
《数据结构c语言版 串的块链存储表示和实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、数据结构C语言版串的块链存储表示和实现祸兮福之所倚,福兮祸之所伏。千淘万漉虽辛苦,吹尽狂沙始到金。二十四桥明月夜,玉人何处教吹箫。眼前道路无经纬,皮里春秋空黑黄。/*数据结构C语言版串的块链存储表示和实现P78编译环境:Dev-C++4.9.9.2日期:2011年2月12日*/#include#include#include#include//LString.h串的块链存储表示#defineCHUNKSIZE4//可由用户定义的
2、块大小typedefstructChunk{charch[CHUNKSIZE];//块的数据域structChunk*next;//块的指针域}Chunk;typedefstruct{Chunk*head,//串的头指针*tail;//串的尾指针intcurlen;//串的当前长度}LString;charblank='#';//全局变量,用于填补空余//初始化(产生空串)字符串T。voidInitString(LString*T){(*T).curlen=0;(*T).head=NULL;(*T).ta
3、il=NULL;}//生成一个其值等于chars的串T(要求chars中不包含填补空余的字符)//成功返回1,否则返回0intStrAssign(LString*T,char*chars){inti,j,k,l;Chunk*p,*q;i=strlen(chars);//i为串的长度if(!i
4、
5、strchr(chars,blank))//串长为0或chars中包含填补空余的字符return0;(*T).curlen=i;j=i/CHUNKSIZE;//j为块链的结点数,块的个数if(i%CHUNKSIZE
6、)//不足一个块的,当成一个块即块数加1j++;for(k=0;knext=p;q=p;}for(l=0;lch+l)=*chars++;if(!*chars)//最后一个链块{(*T).tail=q;q->next=NULL;for(;l7、/用填补空余的字符(blank=‘#’)填满链表*(q->ch+l)=blank;}}return1;}//由串S复制得串T(连填补空余的字符一块拷贝)intStrCopy(LString*T,LStringS){Chunk*h=S.head,*p,*q;(*T).curlen=S.curlen;if(h){p=(*T).head=(Chunk*)malloc(sizeof(Chunk));*p=*h;//复制1个结点h=h->next;while(h)//没到队尾,继续复制块{q=p;p=(Chunk*8、)malloc(sizeof(Chunk));q->next=p;*p=*h;h=h->next;}p->next=NULL;(*T).tail=p;return1;}elsereturn0;}//若S为空串,则返回1,否则返回0intStrEmpty(LStringS){if(S.curlen)//非空return0;elsereturn1;}//若S>T,则返回值>0;若S=T,则返回值=0;若S9、当前待比较字符在S,T串中的位置Chunk*ps=S.head,*pt=T.head;//ps,pt分别指向S和T的待比较块intjs=0,jt=0;//js,jt分别指示S和T的待比较字符在块中的位序while(ich+js)==blank)//跳过填补空余的字符{js++;if(js==CHUNKSIZE){ps=ps->next;js=0;}};//*(ps->ch+js)为S的第i个有效字符w10、hile(*(pt->ch+jt)==blank)//跳过填补空余的字符{jt++;if(jt==CHUNKSIZE){pt=pt->next;jt=0;}};//*(pt->ch+jt)为T的第i个有效字符if(*(ps->ch+js)!=*(pt->ch+jt))return*(ps->ch+js)-*(pt->ch+jt);else//继续比较下一个字符{js++;if(js==CHUNKSIZE){ps=ps->nex
7、/用填补空余的字符(blank=‘#’)填满链表*(q->ch+l)=blank;}}return1;}//由串S复制得串T(连填补空余的字符一块拷贝)intStrCopy(LString*T,LStringS){Chunk*h=S.head,*p,*q;(*T).curlen=S.curlen;if(h){p=(*T).head=(Chunk*)malloc(sizeof(Chunk));*p=*h;//复制1个结点h=h->next;while(h)//没到队尾,继续复制块{q=p;p=(Chunk*
8、)malloc(sizeof(Chunk));q->next=p;*p=*h;h=h->next;}p->next=NULL;(*T).tail=p;return1;}elsereturn0;}//若S为空串,则返回1,否则返回0intStrEmpty(LStringS){if(S.curlen)//非空return0;elsereturn1;}//若S>T,则返回值>0;若S=T,则返回值=0;若S9、当前待比较字符在S,T串中的位置Chunk*ps=S.head,*pt=T.head;//ps,pt分别指向S和T的待比较块intjs=0,jt=0;//js,jt分别指示S和T的待比较字符在块中的位序while(ich+js)==blank)//跳过填补空余的字符{js++;if(js==CHUNKSIZE){ps=ps->next;js=0;}};//*(ps->ch+js)为S的第i个有效字符w10、hile(*(pt->ch+jt)==blank)//跳过填补空余的字符{jt++;if(jt==CHUNKSIZE){pt=pt->next;jt=0;}};//*(pt->ch+jt)为T的第i个有效字符if(*(ps->ch+js)!=*(pt->ch+jt))return*(ps->ch+js)-*(pt->ch+jt);else//继续比较下一个字符{js++;if(js==CHUNKSIZE){ps=ps->nex
9、当前待比较字符在S,T串中的位置Chunk*ps=S.head,*pt=T.head;//ps,pt分别指向S和T的待比较块intjs=0,jt=0;//js,jt分别指示S和T的待比较字符在块中的位序while(ich+js)==blank)//跳过填补空余的字符{js++;if(js==CHUNKSIZE){ps=ps->next;js=0;}};//*(ps->ch+js)为S的第i个有效字符w
10、hile(*(pt->ch+jt)==blank)//跳过填补空余的字符{jt++;if(jt==CHUNKSIZE){pt=pt->next;jt=0;}};//*(pt->ch+jt)为T的第i个有效字符if(*(ps->ch+js)!=*(pt->ch+jt))return*(ps->ch+js)-*(pt->ch+jt);else//继续比较下一个字符{js++;if(js==CHUNKSIZE){ps=ps->nex
此文档下载收益归作者所有