数据结构课设——目录的管理与设计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[10][10],b[10],c[10],d[10];
typedef struct BSTNode//结构体(包括节点信息 左右儿子)
 {
	int key;

    struct BSTNode *lchild,*rchild;

 }BSTNode,*BSTree;

int InsertBST(BSTree &t,int k)
{//若二叉排序树t中没有关键字k,则插入,否则直接返回

     BSTree p,f;
	 p=t;
	 while(p)                           //查找插入位置
	  {
		 if(p->key==k){
			 printf("树中已有该数\n");
			 return 0;}                 //已有k,无需插入

		 f=p;                         //f保存当前查找的结点
	     p=(k<p->key)?p->lchild:p->rchild;   //若k<p->key,在左子树上查找,否则在右子树上查找
	 }

	  p=(BSTree)malloc(sizeof(BSTNode));

	  p->key=k;

	  p->lchild=p->rchild=NULL;

	  if(t==NULL)
		  t=p;                      //如果是空树,则把输入的数给树根

	  else if (k<f->key)
            f->lchild=p;
            else f->rchild=p;
	  return 1;
}//InsertBST
int Delete(BSTree bst, int X)
   //在二叉排序树bst上,删除其关键字为X的结点。
 {
	BSTree f,p=bst;
	while (p && p->key!=X) {//查找值为X的结点

		if (p->key>X)  {f=p; p=p->lchild;}

        else{f=p; p=p->rchild;}
	}
     if (p==NULL)
	 {

		 printf("无关键字为%d的结点\n",X);
		 return 0;
	 }
     if (p->lchild==NULL)
	 {  //被删结点无左子树
       if (f->lchild==p) f->lchild=p->rchild;//将被删结点的右子树接到其双亲上

       else f->rchild=p->rchild;
	 }
    else   //被删结点有左子树
	{
		BSTree q,s;
		q=p;
		s=p->lchild; //s指向被删结点左子树的根
        while (s->rchild !=NULL) //查左子树中最右下的结点(中序最后结点)
		{
			q=s;
			s=s->rchild;
		}

       p->key=s->key; //结点值用其左子树最右下的结点的值代替

	   if (q==p)
		   p->lchild=s->lchild;//被删结点左子树的根结点无右子女

	   else
		   q->rchild=s->lchild; //s是被删结点左子树中序最后一个结点

	   free(s);
	   return 1;

    }
 }
void found(BSTree &p,int k)
{

	 while(p)                           //查找插入位置
	  {
		 if (p->key==k)
		 {

			 printf("             %s--------------------------%d\n",a[p->key],p->key);
			 break;
		 }
	     p=(k<p->key)?p->lchild:p->rchild;   //若k<p->key,在左子树上查找,否则在右子树上查找
	 }
    if(p->key!=k)
		printf("        没有这样的章节\n");
}
void change(BSTree &p,int k)
{

	int j;int t=0;
	while(p)
	{
		if(p->key==k)
		{
			printf("输入更改后的章节名称\n");
			scanf("%s",c);

			t=1;
			strcpy(a[k],c);
			break;
		}
		p=(k<p->key)?p->lchild:p->rchild;
	}
  if(t==0) printf(" 没有这样的章节\n");
}


void zhongxu(BSTree T){
		if(T){

			zhongxu(T->lchild);
            printf("            %s--------------------------%d\n",a[T->key],T->key);

		    zhongxu(T->rchild);
		}
	}//中序


	int main()
	{
		int id,k;
		BSTree t=NULL;

while(1){

printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o\n");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o\n");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o\n");
printf("o^o o*o o-o o^o   请输入所需的功能        o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   1.插入                  o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   2.删除                  o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   3.输出目录              o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   4.查询                  o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   5.更改目录              o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^o   6.退出                  o^o o*o o-o o^o \n");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o\n");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o\n");

		    scanf("%d",&id);

			switch(id)
			{
			case 1:{

printf("-----------------请输入要插入的目录页数:------------------\n");

				scanf("%d",&k);
printf("-----------------请输入要插入的目录名称:------------------\n");
                scanf("%s",a[k]);
				InsertBST(t,k);

				break;
				   }

			case 2:{

printf("-----------------请输入需要删除的数:------------------------\n");

				scanf("%d",&k);
				Delete(t,k);
				break;
				   }

			case 3:{
          printf("                         目录\n");
				zhongxu(t);

				break;
				   }
			case 4:
				{
					int i;int g=0;
					printf("--------------输入章节名称\n");
					scanf("%s",b);
					for(i=0;i<10;i++)
					{
						if(strcmp(a[i],b)==0)
						{
							found(t,i);
							g=1;break;
						}

					}
					if(g==0)printf("--------没有这样的章节-\n");
					break;
				}
			case 5:
				{int i;int g=0;
					printf("---------------输入更改章节名称\n");
						scanf("%s",d);
					for(i=0;i<10;i++)
					{
						if(strcmp(a[i],d)==0)
						{
							change(t,i);g=1;
							break;

						}

					}
					if(g==0)printf("--------没有这样的章节-\n");
						break;
				}
			case 6:
				exit(0);
				break;

			default:
				printf("输入错误!");
				break;
			}
		}
		return 0;
	}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值