数据结构.docx
- 文档编号:12869204
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:125
- 大小:41.29KB
数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(125页珍藏版)》请在冰豆网上搜索。
数据结构
二叉排序树的实现
#include
#include
#defineN10 //数据元素个数
#defineStatusint
#definetrue1
#definefalse0
typedefintKeyType;//设关键字域为整型
typedefstruct
{
KeyTypekey;
intothers;
}ElemType; //数据元素类型
typedefElemTypeTElemType;
typedefstructBiTNode
{
//二叉树的二叉链表存储表示动态查找表(二叉排序树)
TElemTypedata;
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
StatusInitDSTable(BiTree*DT)
{
//构造一个空的动态查找表DT
*DT=NULL;
returntrue;
}
voidDestroyDSTable(BiTree*DT)
{
//销毁动态查找表
if(*DT)//非空树
{
if((*DT)->lchild) //有左孩子
DestroyDSTable(&(*DT)->lchild); //销毁左孩子子树
if((*DT)->rchild) //有右孩子
DestroyDSTable(&(*DT)->rchild); //销毁右孩子子树
free(*DT); //释放根结点
*DT=NULL;//空指针赋0
}
}
BiTreeSearchBST(BiTreeT,KeyTypekey)
{
//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if((!
T)||key==T->data.key)
returnT;
elseif(key
returnSearchBST(T->lchild,key);
else
returnSearchBST(T->rchild,key);
}
StatusSearchBST1(BiTreeT,KeyTypekey,BiTreef,BiTree*p)
{
//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指针p指向该数据元素指针结点,并返回TRUE,否则指针p
//指向查找路径上访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL
if(!
T)
{
*p=f;
returnfalse;
}
elseif(key==T->data.key)
{
*p=T;
returntrue;
}
elseif(key
{
returnSearchBST1(T->lchild,key,T,p);
}
else
{
returnSearchBST1(T->rchild,key,T,p);
}
}
intInsertBST(BiTree*T,ElemTypee)
{
BiTreep,s;
if(!
SearchBST1(*T,e.key,NULL,&p)) //查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!
p)
{
*T=s;//被插结点*s为新的根结点
}
elseif(e.key
{
p->lchild=s; //被插结点*s为左孩子,值小的在左边
}
else
{
p->rchild=s; //被插结点*s为右孩子,值小的在右边
}
returntrue;
}
else
returnfalse; //书中已经有关键字相同的结点,不再插入
}
StatusDelete(BiTree*p)
{
//从二叉排序树中删除结点p,并重接的左或右子树
BiTreeq,s;
if(!
(*p)->rchild)
{
//右子树空则只需重接他的左子树
q=(*p);
*p=(*p)->lchild;
free(q);
}
elseif(!
(*p)->lchild)
{
//只需重接他的右子树
q=(*p);
*p=(*p)->rchild;
free(q);
}
else
{
//左右子树均不空 P230方式d
q=*p;s=(*p)->lchild;
while(s->rchild){
q=s;
s=s->rchild;
}
(*p)->data=s->data;
//s指向被删结点的"前驱"(将被删结点前驱的值取代被删结点的值)
if(q!
=*p)
{
//此种情况是指类似只有左右两个子结点的情况,类似情况下不需改变p->data=s->data已经完成所需改变
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}
returntrue;
}
StatusDeleteBST(BiTree*T,KeyTypekey)
{
//若二叉排序树T存在关键字等于key的数据元素的时候,则删除该数据元素结点
//并返回true,否则返回false
if(!
*T)
{
returnfalse;
}
else
{
if(key==(*T)->data.key)
{
returnDelete(T);
}
elseif(key<(*T)->data.key)
{
returnDeleteBST(&(*T)->lchild,key);
}
else
{
DeleteBST(&(*T)->rchild,key);
}
return1;
}
}
voidTraverseDSTable(BiTreeDT,void(*Visit)(ElemType))
{
if(DT)
{
TraverseDSTable(DT->lchild,Visit); //先中序遍历左子树
Visit(DT->data); //再访问根结点
TraverseDSTable(DT->rchild,Visit); //最后中序遍历右子树
}
}
voidprint(ElemTypec)
{
printf("(%d,%d)",c.key,c.others);
}
intmain()
{
BiTreedt,p;
inti;
KeyTypej;
ElemTyper[N]={
{45,1},{12,2},{53,3},{3,4},{37,5},{24,6},
{100,7},{61,8},{90,9},{78,10}
};//以教科书P227图9.7(a)为例
InitDSTable(&dt);//构造空表
for(i=0;i InsertBST(&dt,r[i]);//依次插入数据元素 TraverseDSTable(dt,print); printf("\n请输入待查找的值: "); scanf("%d",&j); p=SearchBST(dt,j); if(p) { printf("表中存在此值: "); DeleteBST(&dt,j); printf("删除此值后: \n"); TraverseDSTable(dt,print); printf("\n"); } return0; } 求幂集链式实现 #include #include #include #defineTRUE 1 #defineFALSE0 #defineOK 1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW -2 #defineElemTypeint #defineStatus int #defineLIST_INIT_SIZE100 //线性表存储空间的初始分配量 #defineLISTINCREMENT 10 //线性表存储空间的分配增量 typedefstructLNode { ElemTypedata; //存储的数据 structLNode*next; //后继的结点指针 }LNode,*LinkList; voidInitList(LinkList*L) { //InitList_L即CreateList_L //顺序(头插法)n个元素的值,建立带表头结点的单链线性表L inti; LNode*p; (*L)=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; //先建立一个带头结点的单链表 }//InitList intListLength(LinkListL) { //计算链表长度 inti=0; LinkListp=L->next; while(p) { i++; //存在加1 p=p->next;//指向下一个结点 } returni; }//ListLength StatusGetElem(LinkListL,inti,ElemType*e) { LNode*p; intj; //L为带头结点的单链表的头指针 //当第i个元素存在时,其值赋给e并返回OK,否则返回false p=L->next;j=1; //初始化,p指向第一个结点,j为计数器 while(p&&j { p=p->next;++j; } if(! p||j>i) returnERROR; //第i个元素不存在 *e=p->data; //取第i个元素 returnOK; }//GetElem StatusListInsert(LinkList*L,inti,ElemTypee) { LinkListp;intj; LinkLists=(LinkList)malloc(sizeof(LNode)); //生成新结点 //在带头结点的单链线性表L中第i个位置之前插入元素e p=(*L);j=0; while(p&&j { p=p->next;++j; //寻找第i-1个结点 } if(! p||j>i-1) returnERROR; //i小于1或者大于表长+1 s->data=e;s->next=p->next; //插入L中 p->next=s; returnOK; }//ListInsert StatusListDelete(LinkList*L,inti,ElemType*e) { LinkListp,q;intj; //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 p=(*L);j=0; while(p->next&&j { //寻找第i个结点,并令p指向其前趋 p=p->next;++j; } if((! p->next)||j>i-1) returnERROR; //删除位置不合理 q=p->next;p->next=q->next; //删除并释放结点 *e=q->data;free(q); returnOK; }//ListDelete voidOutput(LinkListL){ inte,i=1; intlength=ListLength(L); for(i;i<=length;++i) { GetElem(L,i,&e); printf("%d",e); } //输出空集 if(! length) { printf("Empty"); } printf("\n"); returnOK; } //算法6.15P150 //线性表A表示集合A,线性表B表示幂集ρ(A)的一个元素。 //局部量k为进入函数时表B的当前长度。 //第一次调用本函数时,B为空表,i=1。 voidGetPowerSet(inti,LinkListA,LinkList*B){ ElemTypex; intk; if(i>ListLength(A)) Output(*B);//输出当前B值,即ρ(A)的一个元素 else{ GetElem(A,i,&x); k=ListLength(*B); ListInsert(B,k+1,x); GetPowerSet(i+1,A,B); ListDelete(B,k+1,&x); GetPowerSet(i+1,A,B); } } intmain(){ intn,i; ElemTypee; LinkLista,b; printf("请输入集合A的元素个数: \n"); scanf("%d",&n); InitList(&a); printf("请输入集合中的元素: \n"); for(i=1;i<=n;i++){ scanf("%d",&e); ListInsert(&a,i,e); } InitList(&b); printf("进行冥集合运算! \n"); GetPowerSet(1,a,&b); return0; } /* 请输入集合A的元素个数: 3 请输入集合A的元素: (空格区分) 123 */ Haffman树(最优二叉树)的线性实现 #include #include #include typedefstruct { unsignedintweight; unsignedintparent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组存储赫夫曼数 typedefchar**HuffmanCode;//动态分配数组存储赫夫曼编码树 //函数voidselect()调用 intmin1(HuffmanTreet,inti) { intj,flag; unsignedintk=UINT_MAX;//取k为不小于可能的值 for(j=1;j<=i;j++) { if(t[j].weight k=t[j].weight,flag=j; } t[flag].parent=1; returnflag; } //s1为最小的两个值中序号小的那个 voidSelect(HuffmanTreet,inti,int*s1,int*s2) { intj; *s1=min1(t,i); *s2=min1(t,i); if(*s1>*s2) { j=*s1; *s1=*s2; *s2=j; } } voidHuffmanCoding_FromLeaf(HuffmanTree*HT,HuffmanCode*HC,int*w,intn) { //w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC intm,s1,s2,i,start; unsignedintc,f; HuffmanTreep; char*cd; if(n<=1) return; m=2*n-1; *HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用 for(p=*HT+1,i=1;i<=n;++i,++p,++w) { (*p).weight=*w; (*p).parent=0; (*p).lchild=0; (*p).rchild=0; } for(;i<=m;++i,++p) //初始化双亲位置 (*p).parent=0; for(i=n+1;i<=m;++i) { //建赫夫曼树 //在HT[1...i-1] Select(*HT,i-1,&s1,&s2); (*HT)[s1].parent=i;(*HT)[s2].parent=i; (*HT)[i].lchild=s1;(*HT)[i].rchild=s2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构