数据结构实验.docx
- 文档编号:3582571
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:15
- 大小:74.32KB
数据结构实验.docx
《数据结构实验.docx》由会员分享,可在线阅读,更多相关《数据结构实验.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构实验
#defineMaxSize10
#include
#include
typedefcharElemType;
typedefstruct
{
ElemTypedata[MaxSize];
intlength;
}SqList;
voidInitList(SqList*&L)
{
L=(SqList*)malloc(sizeof(SqList));
L->length=0;
}
boolListInsert(SqList*&L,inti,ElemTypee)
{
intj;
if(i<1||i>L->length+1)
returnfalse;
i--;
for(j=L->length;j>i;j--)
L->data[i]=L->data[j-1];
L->data[i]=e;
L->length++;
returntrue;
}
voidDispList(SqList*L)
{
inti;
for(i=0;i
printf("%c",L->data[i]);
printf("\n");
}
intListLength(SqList*L)
{
return(L->length);
}
boolListEmpty(SqList*L)
{
return(L->length==0);
}
boolGetElem(SqList*L,inti,ElemType&e)
{
if(i<1||i>L->length)
returnfalse;
e=L->data[i-1];
returntrue;
}
intLocateElem(SqList*L,ElemTypee)
{
inti=0;
while(i
=e)
i++;
if(i>L->length)
return0;
else
returni+1;
}
boolListDelete(SqList*&L,inti,ElemType&e)
{
intj;
if(i<1||i>L->length)
returnfalse;
i--;
e=L->data[i];
for(j=i;j
L->length--;
returntrue;
}
voidDestroyList(SqList*&L)
{
free(L);
}
voidmain()
{
SqList*h;
inti=1;
ElemTypee;
printf("
(1)初始化顺序表\n");
InitList(h);
printf("
(2)依次采用尾插法插入abcde\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf("(3)输出循环单链表h:
\n");
DispList(h);
printf("(4)循环单链表h的长度为%d\n",ListLength(h));
printf("(5)单链表h为%s\n",(ListEmpty(h)?
"空":
"非空"));
GetElem(h,3,e);
printf("(6)循环单链表h的第3个元素是%c\n",e);
GetElem(h,3,e);
printf("(7)元素a的位置=%d\n",LocateElem(h,'a'));
printf("(8)在第4个元素位置上插入元素f\n");
ListInsert(h,4,'f');
printf("(9)输出循环单链表表h:
");
DispList(h);
printf("(10)删除L的第3个元素\n");
ListDelete(h,3,e);
printf("(11)输出循环单链表h:
");
DispList(h);
printf("(12)释放顺序表h\n");
DestroyList(h);
printf("雷志超电信1301班\n");
}
//文件名:
exp实验二7-4.cpp
#include
#include
#defineMaxSize100
#defineMaxWidth40
typedefcharElemType;
typedefstructnode
{
ElemTypedata;//数据元素
structnode*lchild;//指向左孩子
structnode*rchild;//指向右孩子
}BTNode;
voidDestroyBTNode(BTNode*&b)
{
if(b!
=NULL)
{
DestroyBTNode(b->lchild);
DestroyBTNode(b->rchild);
free(b);
}
}
voidDispBTNode(BTNode*b)//以括号表示法输出二叉树
{
if(b!
=NULL)
{
printf("%c",b->data);
if(b->lchild!
=NULL||b->rchild!
=NULL)
{
printf("(");
DispBTNode(b->lchild);
if(b->rchild!
=NULL)printf(",");
DispBTNode(b->rchild);
printf(")");
}
}
}
externvoidDispBTNode(BTNode*b);
externvoidDestroyBTNode(BTNode*&b);
BTNode*CreateBT1(char*pre,char*in,intn)
{
BTNode*s;
char*p;
intk;
if(n<=0)returnNULL;
s=(BTNode*)malloc(sizeof(BTNode));//创建二叉树节点*s
s->data=*pre;
for(p=in;p if(*p==*pre) break; k=p-in; s->lchild=CreateBT1(pre+1,in,k); s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); returns; } BTNode*CreateBT2(char*post,char*in,intn,intm) { BTNode*s; char*p,*q,*maxp; intmaxpost,maxin,k; if(n<=0)returnNULL; maxpost=-1; for(p=in;p for(q=post;q if(*p==*q) { k=q-post; if(k>maxpost) { maxpost=k; maxp=p; maxin=p-in; } } s=(BTNode*)malloc(sizeof(BTNode));//创建二叉树节点*s s->data=post[maxpost]; s->lchild=CreateBT2(post,in,maxin,m); s->rchild=CreateBT2(post,maxp+1,n-maxin-1,m); returns; } voidDispBTNode1(BTNode*b)//以凹入表表示法输出一棵二叉树 { BTNode*St[MaxSize],*p; intlevel[MaxSize][2],top=-1,n,i,width=4; chartype; if(b! =NULL) { top++; St[top]=b;//根节点入栈 level[top][0]=width; level[top][1]=2;//2表示是根 while(top>-1) { p=St[top];//退栈并凹入显示该节点值 n=level[top][0]; switch(level[top][1]) { case0: type='L';break;//左节点之后输出(L) case1: type='R';break;//右节点之后输出(R) case2: type='B';break;//根节点之后前输出(B) } for(i=1;i<=n;i++)//其中n为显示场宽,字符以右对齐显示 printf(""); printf("%c(%c)",p->data,type); for(i=n+1;i<=MaxWidth;i+=2) printf("--"); printf("\n"); top--; if(p->rchild! =NULL) {//将右子树根节点入栈 top++; St[top]=p->rchild; level[top][0]=n+width;//显示场宽增width level[top][1]=1;//1表示是右子树 } if(p->lchild! =NULL) {//将左子树根节点入栈 top++; St[top]=p->lchild; level[top][0]=n+width;//显示场宽增width level[top][1]=0;//0表示是左子树 } } } } voidmain() { BTNode*b; ElemTypepre[]="ABDEHJKLMNCFGI"; ElemTypein[]="DBJHLKMNEAFCGI"; ElemTypepost[]="DJLNMKHEBFIGCA"; b=CreateBT1(pre,in,14); printf("先序序列: %s\n",pre); printf("中序序列: %s\n",in); printf("构造一棵二叉树b: \n"); printf("括号表示法: ");DispBTNode(b);printf("\n"); printf("凹入表示法: \n");DispBTNode1(b);printf("\n\n"); printf("中序序列: %s\n",in); printf("后序序列: %s\n",post); b=CreateBT2(post,in,14,14); printf("构造一棵二叉树b: \n"); printf("括号表示法: ");DispBTNode(b);printf("\n"); printf("凹入表示法: \n");DispBTNode1(b);printf("\n"); DestroyBTNode(b); printf("雷志超电信1301"); } //文件名: 实验三9-8.cpp #include #defineMaxSize100//定义最大哈希表长度 #defineNULLKEY-1//定义空关键字值 #defineDELKEY-2//定义被删关键字值 typedefintKeyType;//关键字类型 typedefchar*InfoType;//其他数据类型 typedefstruct { KeyTypekey;//关键字域 InfoTypedata;//其他数据域 intcount;//探查次数域 }HashTable[MaxSize];//哈希表类型 voidInsertHT(HashTableha,int&n,KeyTypek,intp)//将关键字k插入到哈希表中 { inti,adr; adr=k%p; if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)//x[j]可以直接放在哈希表中 { ha[adr].key=k; ha[adr].count=1; } else//发生冲突时采用线性探查法解决冲突 { i=1;//i记录x[j]发生冲突的次数 do { adr=(adr+1)%p; i++; }while(ha[adr].key! =NULLKEY&&ha[adr].key! =DELKEY); ha[adr].key=k; ha[adr].count=i; } n++; } voidCreateHT(HashTableha,KeyTypex[],intn,intm,intp)//创建哈希表 { inti,n1=0; for(i=0;i { ha[i].key=NULLKEY; ha[i].count=0; } for(i=0;i InsertHT(ha,n1,x[i],p); } intSearchHT(HashTableha,intp,KeyTypek)//在哈希表中查找关键字k { inti=0,adr; adr=k%p; while(ha[adr].key! =NULLKEY&&ha[adr].key! =k) { i++;//采用线性探查法找下一个地址 adr=(adr+1)%p; } if(ha[adr].key==k)//查找成功 returnadr; else//查找失败 return-1; } intDeleteHT(HashTableha,intp,intk,int&n)//删除哈希表中关键字k { intadr; adr=SearchHT(ha,p,k); if(adr! =-1)//在哈希表中找到该关键字 { ha[adr].key=DELKEY; n--;//哈希表长度减1 return1; } else//在哈希表中未找到该关键字 return0; } voidDispHT(HashTableha,intn,intm)//输出哈希表 { floatavg=0; inti; printf("哈希表地址: \t"); for(i=0;i printf("%3d",i); printf("\n"); printf("哈希表关键字: \t"); for(i=0;i if(ha[i].key==NULLKEY||ha[i].key==DELKEY) printf("");//输出3个空格 else printf("%3d",ha[i].key); printf("\n"); printf("搜索次数: \t"); for(i=0;i if(ha[i].key==NULLKEY||ha[i].key==DELKEY) printf("");//输出3个空格 else printf("%3d",ha[i].count); printf("\n"); for(i=0;i if(ha[i].key! =NULLKEY&&ha[i].key! =DELKEY) avg=avg+ha[i].count; avg=avg/n; printf("平均搜索长度ASL(%d)=%g\n",n,avg); } voidmain() { intx[]={16,74,60,43,54,90,46,31,29,88,77}; intn=11,m=13,p=13,i,k=29; HashTableha; CreateHT(ha,x,n,m,p); DispHT(ha,n,m); i=SearchHT(ha,p,k); if(i! =-1) printf("ha[%d].key=%d\n",i,k); else printf("提示: 未找到%d\n",k); k=77; printf("删除关键字%d\n",k); DeleteHT(ha,p,k,n); DispHT(ha,n,m); i=SearchHT(ha,p,k); if(i! =-1) printf("ha[%d].key=%d\n",i,k); else printf("提示: 未找到%d\n",k); printf("插入关键字%d\n",k); InsertHT(ha,n,k,p); DispHT(ha,n,m); printf("\n"); printf("雷志超电信1301\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验