数据结构程序.docx
《数据结构程序.docx》由会员分享,可在线阅读,更多相关《数据结构程序.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构程序
数据结构程序
1、第三章字符串
2、第五章二叉树递归中序遍历
3、第五章二叉树非递归后序遍历
4、第六章有向图的深度遍历(邻接矩阵)
5、第六章画有向图的深度遍历和宽度遍历的图(邻接表)
6、根据后序、中序遍历画出相应的二叉树
姓名:
谌菂
学号:
201223050110
1、字符串
#include
#include
usingnamespacestd;
constintdfsize=128;
classqs
{
public:
qs(intsz=dfsize);
qs(constchar*init);
~qs(){delete[]ch;}
intlength()const{returncurlength;}
voidout()
{
cout<<"输出字符串"<cout<}
voidij(char*h,char*c);
voidbj(char*p);
private:
char*ch;
intcurlength;
intmaxsize;
};
qs:
:
qs(intsz)
{maxsize=sz;
ch=newchar[maxsize+1];
if(ch==NULL)
{
cout<<"存储分配错误\n";
exit
(1);}
curlength=0;
ch[0]='\0';}
qs:
:
qs(constchar*init)
{intlen=strlen(init);
maxsize=(len>dfsize)?
len:
dfsize;
ch=newchar[maxsize+1];
if(ch==NULL)
{cout<<"存储分配出错!
\n";exit
(1);}
curlength=len;
strcpy(ch,init);}
voidqs:
:
ij(char*h,char*c)
{
inthlen=strlen(h),clen=strlen(c);
char*a=newchar[hlen+1],*r=newchar[clen];
strcpy(a,h);
for(inti=0;i<=hlen;i++)
ch[curlength+i]=a[i];
curlength=curlength+hlen;
for(intj=0;j<=clen;j++)
ch[curlength+j]=r[j];
curlength=curlength+hlen;}
voidqs:
:
bj(char*p)
{char*f;
intplen=strlen(p),len=strlen(ch);
intmax=(len>plen)?
len:
plen;
for(inti=0;i{
if(*(ch+i)>*(p+i))
break;
else
if(*(ch+i)<*(p+i))
{f=ch;
ch=p;
p=f;
break;
}}
cout<voidmain()
{
chars[]="谌",t[]="菂";
qsq1(s),q2(t);
q1.ij(s,t);
q2.bj(s);
}
2、二叉树递归中序遍历
#include
usingnamespacestd;
template
structbinode
{
ddata;
binode*lchild,*rchild;
};
template
classbitree
{public:
bitree()
{root=creat(root);}
~bitree()
{release(root);}
voidinorder()
{inorder(root);}
private:
binode*root;
binode*creat(binode*bt);
voidrelease(binode*bt);
voidinorder(binode*bt);
};
emplate
binode*bitree:
:
creat(binode*bt)
{dch;cin>>ch;
cout<<"*bt="<if(ch=='#')bt=NULL;
else{
bt=newbinode;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->rchild);
}returnbt;
};
template
voidbitree:
:
release(binode*bt)
{
if(bt!
=NULL)
{
release(bt->lchild);
release(bt->rchild);
deletebt;}
};
template
voidbitree:
:
inorder(binode*bt)
{
if(bt==NULL)
{
cout<<"#";
return;}
else
{
inorder(bt->lchild);
cout<data;
inorder(bt->rchild);
}
}
voidmain()
{
cout<<"前序遍历请输入字符结点,#表示空子树"<bitreea;
cout<<"\n中序遍历"<a.inorder();
cout<}
3、二叉树非递归后序遍历
#include
usingnamespacestd;
constintmaxsize=100;
template
structbinode
{
ddata;
binode*lchild,*rchild;};
template
structfbinode
{fbinode(){ptr=NULL;}
binode*ptr;
intflag;};
template
classbitree
{public:
bitree()
{root=creat(root);}
~bitree()
{release(root);}
voidpostorder();
private:
binode*root;
binode*creat(binode*bt);
voidrelease(binode*bt);};
template
binode*bitree:
:
creat(binode*bt)
{dch;cin>>ch;
cout<<"*bt="<if(ch=='#')bt=NULL;
else{
bt=newbinode;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->rchild);}
returnbt;
};
template
voidbitree:
:
release(binode*bt)
{
if(bt!
=NULL)
{
release(bt->lchild);
release(bt->rchild);
deletebt;
}
};
template
voidbitree:
:
postorder()
{
binode*bt=root;
fbinodes[maxsize];
inttop=-1;
while(bt!
=NULL||top!
=-1)
{while(bt!
=NULL)
{s[++top].ptr=bt;s[top].flag=1;
bt=bt->lchild;}
while(top!
=-1&&s[top].flag==2)
{bt=s[top--].ptr;cout<data<if(top!
=-1){s[top].flag=2;bt=s[top].ptr;bt=bt->rchild;}
else
{
bt=NULL;}}
cout<voidmain()
{cout<<"前序遍历请输入字符结点,#表示空子树"<bitreea;
cout<<"\n后序遍历"<a.postorder();
cout<
4、有向图的深度遍历
#include
usingnamespacestd;
constintmaxsize=10;
template
classmgraph
{
public:
mgraph(da[],intn,inte);
~mgraph(){};
voiddfstraverse(intv);
voidbfstraverse(intv);
private:
dvertex[maxsize];
intarc[maxsize][maxsize];
intvisited[maxsize];
intvertexnum,arcnum;
};
template
mgraph:
:
mgraph(da[],intn,inte)
{
inti,j,k;vertexnum=n;arcnum=e;
for(i=0;ifor(i=0;ifor(j=0;jarc[i][j]=0;
cout<<"依次输入每一条边"<for(k=0;k{cin>>i>>j;arc[i][j]=1;}
cout<<"输出邻接矩阵:
"<for(i=0;i{for(j=0;jcout<<"\t"<cout<}
for(j=0;j};
template
voidmgraph:
:
dfstraverse(intv)
{
intj;
visited[v]=1;
cout<<""<for(j=0;jif(arc[v][j]==1&&visited[j]==0)dfstraverse(j);
};
voidmain()
{
chara[]={'1','2','3','4','5'};
mgraphta(a,6,6);
cout<<"深度优先遍历:
"<ta.dfstraverse(0);
cout<}
5、第六章画有向图的深度遍历和宽度遍历的图(邻接表)