1、相关类型说明
#define chunksize 8
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
typedef struct chunk
{ char ch[chunksize];
structchunk *next;
}chunk;//块链结点类型
typedef struct
{ chunk *head,*tail; //块链指向头尾结点的指针
int curlen;//块链中串的长度
}lstring; //块链类型
2、需要实现的算法。
void strassign(lstring&T,char *str)
将一个不包含’#’字符串str赋值到块链类型变量T中
链表生成
void clrstring(lstring &T)
将一个块链T中的所有结点释放,最终使得T.head=T.tail=null T.curlen=0
void strprint(lstring T)
打印一个存放在块链T中的字符串
2、需要实现的算法及功能动画演示。
void strinsert(lstring&T,int pos,lstring S)
将块链S插入到块链T中第pos个字符之前
如下例所示 strinsert(&T, 7 , S)
3、需要实现的算法。
void zip(lstring&T)
实验代码
#define chunksize 8
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
typedef struct chunk
{ char ch[chunksize];
struct chunk *next;
}chunk;//块链节点类型
typedef struct
{
chunk *head,*tail;//块链指向头尾指针
int curlen; //块链中串的长度
}lstring; //块链的类型
void strassign(lstring &T,char *str)
{
chunk *aa;
int n1,n2;
int len;
aa=new chunk;
T.head=T.tail=aa;
T.head->next=T.tail->next=NULL;
len=strlen(str);
T.curlen=len;
n1=len/8;
int o;
o=n1;
n2=len%8;
int cnm=0;
int y;
y=0;
int ff;
if(o!=0)
{
while(n1--)
{
if(cnm==0)
{
for(int i=0;i<8;i++)
{
T.tail->ch[i]=str[y];
y++;
}
cnm=1;
}
else
{
aa=new chunk;
T.tail->next=aa;
T.tail=aa;
for(int i=0;i<8;i++)
{
T.tail->ch[i]=str[y];
y++;
}
}
}
if(n2!=0)
{
aa=new chunk;
T.tail->next=aa;
T.tail=aa;
for(int i=0;i<8;i++)
{
if(i<n2)
{
T.tail->ch[i]=str[y];
y++;
}
else
{
T.tail->ch[i]='#';
}
}
}
T.tail->next=NULL;
}
else
{
for(int i=0;i<8;i++)
{
if(i<n2)
{
T.tail->ch[i]=str[y];
y++;
}
else
{
T.tail->ch[i]='#';
}
}
T.tail->next=NULL;
}
}
void clrstring(lstring &T)
{
chunk *aa;
while(T.head!=0)
{
aa=T.head;
free(T.head);
T.head=aa;
}
T.tail=T.head=NULL;
T.curlen=0;
}
void strprint(lstring T)//shuchu
{
chunk *bb;
int yy=0;
bb=T.head;
while(bb!=NULL)
{
if(yy==0)
{
for(int i=0;i<8;i++)
printf("%c",bb->ch[i]);
yy=1;
}
else
{
printf("->");
for(int i=0;i<8;i++)
{
printf("%c",bb->ch[i]);
}
}
bb=bb->next;
}
}
void strinsert(lstring &T,int pos,lstring S)
{
chunk *pp;
pp=T.head;
int qyx=0;
while(pp!=NULL)
{
pp=pp->next;
qyx++;
}
if(pos==1)//通过
{
S.tail->next=T.head;
T.head=S.head;
return;
}
else if(pos==qyx*8+1)//通过
{
T.tail->next=S.head;
T.tail=S.tail;
return;
}
else
{
int z=0;
chunk *aa;
aa=T.head;
while(aa!=NULL)
{
aa=aa->next;
z++;
}
if(pos<=8)//通过
{
chunk *wc1,*wc2;
wc1=new chunk;
wc2=new chunk;
chunk *wc11,*wc22;
wc11=wc1;
wc22=wc2;
for(int i=0;i<8;i++)
wc1->ch[i]='#';
for(int i=0;i<8;i++)
wc2->ch[i]='#';
int wyx=0;
int i;
for(i=0;i<pos-1;i++)
{
wc11->ch[i]=T.head->ch[i];
}
for(;i<=7;i++)
{
wc22->ch[wyx]=T.head->ch[i];
wyx++;
}
chunk *rnm;
rnm=T.head->next;
T.head=wc11;
wc11->next=S.head;
S.tail->next=wc22;
wc22->next=rnm;
}
else if(pos>=(z-1)*8+1&&pos<=z*8)//通过
{
int rr;
rr=pos%8;
if(rr==0)
{
rr=8;
}
if(pos==(z-1)*8+1)
{
chunk *op;
op=T.head;
while(op->next!=T.tail)
{
op=op->next;
}
op->next=S.head;
S.tail->next=T.tail;
return;
}
else
{
chunk *op;
op=T.head;
while(op->next!=T.tail)
{
op=op->next;
}
chunk *wc1,*wc2;
wc1=new chunk;
wc2=new chunk;
chunk *wc11,*wc22;
wc11=wc1;
wc22=wc2;
for(int i=0;i<8;i++)
wc1->ch[i]='#';
for(int i=0;i<8;i++)
wc2->ch[i]='#';
int wyx=0;
int i;
for(i=0;i<rr-1;i++)
{
wc11->ch[i]=T.tail->ch[i];
}
for(;i<=7;i++)
{
wc22->ch[wyx]=T.tail->ch[i];
wyx++;
}
op->next=wc11;
wc11->next=S.head;
S.tail->next=wc22;
T.tail=wc22;
T.tail->next=NULL;
return;
}
}
else
{
int rr;
rr=pos%8;
if(rr==0)
{
rr=8;
}
int ee=0;
chunk *w1,*w2;
w2=w1=T.head;
while(pos-8>ee)
{
ee+=8;
w2=w1;
w1=w1->next;
}
if(rr==1)//通过
{
w2->next=S.head;
S.tail->next=w1;
}
else
{
chunk *wc1,*wc2;
wc1=new chunk;
wc2=new chunk;
chunk *wc11,*wc22;
wc11=wc1;
wc22=wc2;
for(int i=0;i<8;i++)
wc1->ch[i]='#';
for(int i=0;i<8;i++)
wc2->ch[i]='#';
int wyx=0;
int i;
for(i=0;i<rr-1;i++)
{
wc11->ch[i]=w1->ch[i];
}
for(;i<=7;i++)
{
wc22->ch[wyx]=w1->ch[i];
wyx++;
}
chunk *opop;
opop=w1->next;
w2->next=wc11;
wc11->next=S.head;
S.tail->next=wc22;
wc22->next=opop;
return;
}
}
}
}
void zip(lstring T,char *map)
{
memset(map,'\0',sizeof(map));
chunk *oo;
oo=T.head;
int you=0;
while(oo!=NULL)
{
for(int i=0;i<8;i++)
{
if(oo->ch[i]>='a'&&oo->ch[i]<='z')
{
map[you++]=oo->ch[i];
printf("%c",oo->ch[i]);
}
}
oo=oo->next;
}
}
int main()
{
char s[100]; lstring T1,T2,T3;
int len;
printf("\n请输入第一个长度不超过100个字符的字符串(不包含字符'#'):\n");
gets(s);
len=strlen(s);
if(len%8!=0)
{
len=(len/8+1)*8;
}
strassign(T1,s);
printf("\n第一次输入时形成的链表,表示如下:\n");
strprint(T1);
printf("\n请输入第二个长度不超过100个字符的字符串(不包含字符'#'):\n");
gets(s);
strassign(T2,s);
printf("\n第二次输入时形成的链表,表示如下:\n");
strprint(T2);
int k;
printf("\n请输入您需要插入的位置(在第几位之前插入取值范围在1~%d):",len+1);
scanf("%d",&k);
while(1)
{
if(k<1||k>len+1)
{
printf("插入错误,请重新输入插入位置\n");
scanf("%d",&k);
}
else
{
break;
}
}
strinsert(T1,k,T2);
strprint(T1);
getchar();
printf("\n输出压缩后的字符串:\n");
char map[200];
zip(T1,map);
strassign(T3,map);
printf("\n压缩形成的链表,表示如下:\n");
strprint(T3);
}