线性表的顺序存储结构
的有关信息介绍如下:问题补充说明:实验内容: 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历(依次打印出每个数据元素)。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。 4.实现把该表中某个数据元素删除。 5.实现在该表中插入某个数据元素。 6编写一个主函数,调试上述算法。 实验说明: 1.算法1至算法5可以以头文件的方式存储,主函数实现该头文件的包含即可调用 2.建立顺序表时可利用随机函数自动产生数据。
#include<stdio.h>
#include<stdlib.h>
#include<c360问答onio.h>
structnode
{
intvalue;
structnode*left;
structnode*right;
};
typedefstructnodeNODE;
typedefstructnode*PNODE;
voidnew_node(PNODE*n,intvalue)
{
*n=(PNODE)m蒸织群洋洋吧挥刚居物alloc(sizeof(NODE));
if(*n!=NULL)
{
(*n)->value=value;
(*n)->lef基权松止利t=NULL;
(*n)->right=NULL;
}
}
voidfree_node(PNODE*n)
{
if((*n)!=NU花LL)
{
free(*n);
*n=NULL;
}
}
voidfree_tree(PNODE*n)
{
if(*n==NULL)return;
if((*n)->left!=NULL)
{
free_tree(&((*n)->lef酒信效与t));
}
if((唱岩省*n)->right!=NULL)
{
free_tree(&((*n)->right));
}
free_node(n);
}
PNODEfind_node(领PNODEn,intvalue)
{
if(n==NULL)
{
returnNULL;
放情前粮二耐叶质别知扬}
elseif(n->value==value)
{
returnn;
}
e河析校阳专lseif(value<=n->value)
{
returnfind_node(n->left,value);
}
else
{
returnfind_node(n->right,value);
}
}
voidinsert_node(PNODE*n,intvalue)
{
if(*n==NULL)
{
new_n雷容烟草督善走毫画ode(n,value);
}
elseif(value==(*n)->value)
{
return;
}
elseif(value<(*n)->value)
{
insert_node(&((*n)->left),value);
}
else
{
insert_node(&((*n)->right),value);
}
}
intget_max_depth(PNODEn)
{
intle象九久ft=0;
intright=0;
if(n垂温南==NULL)
{
return0;
}
if(n->left!=NULL)
{
left=1+get_max_dept济协钢规防肥自渐可条h(n->left);
}
if(n->right!=NULL)
{
right=1+get_max_depth(n->right);
}
retur当n(left>right?left:right);
}
intget_min_depth(PNODEn)
{
intleft=0;
intright=0马听丝利程移室翻吃从;
if(n==NULL)
{
return0;
}
if(n->left!=NULL)
{
left=1+get_min_depth(n原皇引宪至介善女->left);
模般图沙来就未和}
if(n->right!=NULL)
{
right=1+get_min_depth(n副加->right);
}
return(left<right?left:right);
}
intget_num_nodes(PNODEn)
{
intleft=0;
intrigh决课失具线棉观府刻临江t=0;
if(n==NULL)
{
return0;
}
if(n->left!=NULL)
{
left=get_num_nodes(n->left);
}
if(n->right!=NULL)
{
right=get_num_nodes(n->right);
}
return(left+1+right);
}
intget_min_value(PNODEn)
{
if(n==NULL)return0;
if(n->left==NULL)
{
returnn->value;
}
else
{
returnget_min_value(n->left);
}
}
intget_max_value(PNODEn)
{
if(n==NULL)return0;
if(n->right==NULL)
{
returnn->value;
}
else
{
returnget_max_value(n->right);
}
}
voiddeletenode(PNODE*n)
{
PNODEtmp=NULL;
if(n==NULL)return;
if((*n)->right==NULL){
tmp=*n;
*n=(*n)->left;
free_node(n);
}
elseif((*n)->left==NULL)
{
tmp=*n;
*n=(*n)->right;
free_node(n);
}
else
{
for(tmp=(*n)->right;tmp->left!=NULL;tmp=tmp->left);
tmp->left=(*n)->left;
tmp=(*n);
*n=(*n)->right;
free_node(&tmp);
}
}
voiddelete_node(PNODE*n,intvalue)
{
PNODEnode;
if(n==NULL)return;
node=find_node(*n,value);
if((*n)->value==value)
{
deletenode(n);
}
elseif(value<(*n)->value)
{
delete_node(&((*n)->left),value);
}
else
{
delete_node(&((*n)->right),value);
}
}
voidpre_order_traversal(PNODEn)
{
if(n!=NULL)
{
printf("%i",n->value);
pre_order_traversal(n->left);
pre_order_traversal(n->right);
}
}
voidin_order_traversal(PNODEn)
{
if(n!=NULL)
{
in_order_traversal(n->left);
printf("%i",n->value);
in_order_traversal(n->right);
}
}
voidpost_order_traversal(PNODEn)
{
if(n!=NULL)
{
post_order_traversal(n->left);
post_order_traversal(n->right);
printf("%i",n->value);
}
}
voidmain()
{
charbuf[50];
intoption;
PNODEtree=NULL;
PNODEnode=NULL;
while(1)
{
printf("-------------------\n");
printf("Optionsare:\n\n");
printf("0Exit\n");
printf("1Insertnode\n");
printf("2Deletenode\n");
printf("3Findnode\n");
printf("4Preordertraversal\n");
printf("5Inordertraversal\n");
printf("6Postordertraversal\n");
printf("7Maxdepth\n");
printf("8Mindepth\n");
printf("9Maxvalue\n");
printf("10Minvalue\n");
printf("11NodeCount\n\n");
printf("-------------------\n");
printf("Selectanoption:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%i",&option);
printf("-------------------\n");
if(option<0||option>11)
{
fprintf(stderr,"Invalidoption");
continue;
}
switch(option)
{
case0:
exit(0);
case1:
printf("Enternumbertoinsert:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%i",&option);
printf("\n\n");
insert_node(&tree,option);
break;
case2:
printf("Enternumbertodelete:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%i",&option);
printf("\n\n");
delete_node(&tree,option);
break;
case3:
printf("Enternumbertofind:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%i",&option);
printf("\n\n");
node=find_node(tree,option);
if(node!=NULL)
{
printf("FOUNDnode\n\n");
}
else
{
printf("Couldn'tfindnode\n\n");
}
break;
case4:
printf("Preordertraversal:");
pre_order_traversal(tree);
printf("\n\n");
break;
case5:
printf("Inordertraversal:");
in_order_traversal(tree);
printf("\n\n");
break;
case6:
printf("Postordertraversal:");
post_order_traversal(tree);
printf("\n\n");
break;
case7:
printf("Maxdepthis%i\n\n",get_max_depth(tree));
break;
case8:
printf("Mindepthis%i\n\n",get_min_depth(tree));
break;
case9:
printf("Maxvalueis%i\n\n",get_max_value(tree));
break;
case10:
printf("Minvalueis%i\n\n",get_min_value(tree));
break;
case11:
printf("NodeCountis%i\n\n",get_num_nodes(tree));
break;
}
}
printf("PressAnykeytoEndtheProgram!");
getch();
}