数据结构--课程设计(归档)

这里是2020/12/7就开始的致命课程设计QAQ
//东拼西凑最终归档

(一)链表

  • 报数问题(单向循环链表)
#include<bits/stdc++.h>
 
using namespace std;
 
/************约瑟夫问题****************/
 
typedef struct node
{
    int data;
    struct node *next;
}LNode,*LinkList;
 
 void creatLink(LinkList &L,int num)
 {
     LinkList s,r;
     int i;
     r=L;
     for(i=1;i<=num;i++)
     {
        s=new LNode;
        s->data=i;
        r->next=s;
        r=s;
     }
     r->next=L->next;
 }
LinkList YSF(LinkList L,int k)
{
    LinkList p;
    int i;
    p=L->next;
    while(p->next!=p)
    {
        for(i=1;i<k-1;i++)
        {
            p=p->next;
        }
        p->next=p->next->next;
        p=p->next;
    }
    return p;
}
int main()
{
    LinkList L,s;
    int n,k;
    L=new LNode;
    cin>>n>>k;
    creatLink(L,n);
    s=YSF(L,k);
    cout<s->data<<endl;
    return 0;
}

(二)栈与队列

  • 停车场问题

这里有bug:简单讲就是非顺序出车会出错

#include<bits/stdc++.h>
using namespace std;

#define  stacksize  10
 typedef  struct  sqstack
 {
  int  data[stacksize];
  int  top;
 } SqStackTp;


void INITstack(SqStackTp &s)//初始化栈
{
    s.top=-1;
    memset(s.data,0,sizeof(s.data));
}
void InStack(SqStackTp &s,int num)//入栈
{
    if(s.top!=stacksize-1)//栈未满
    {
        s.top++;
        s.data[s.top]=num;
    }
}
int OutStack(SqStackTp &s)//出栈
{
    int x;
    if(s.top!=-1)
    {
        x=s.data[s.top];
        s.top--;
    }
    return x;
}

typedef struct  linked_queue
{
  int  data;
  struct  linked_queue  * next;
}LqueueTp;
typedef  struct
{
  LqueueTp  *front ,  *rear ;
} QueptrTp;

void INITQueue(QueptrTp &Q)//初始化队列
{
    Q.front=Q.rear=new LqueueTp;
    Q.front->next=NULL;
}
void InQueue(QueptrTp &Q,int x)//入队
{
    LqueueTp *p1;
    p1=new LqueueTp;//指针节点
    p1->data=x;
    p1->next=NULL;
    //尾插
    Q.rear->next=p1;
    Q.rear=p1;
}
int OutQueue(QueptrTp &Q)//出队
{
    int x;
    LqueueTp *p;
    if(Q.front!=Q.rear)
    {
        p=Q.front->next;
        x=p->data;
        Q.front->next=p->next;
        if(p==Q.rear)
        {
            Q.rear=Q.front;
        }
        delete(p);
    }return x;
}
//全局变量等候便道队列
    //QueptrTp Q;

//全局变量临时栈
    //SqStackTp tmpstack;
    //SqStackTp parkstack;

//指令1--进入停车场
void INparking(SqStackTp &parkstack,int num,QueptrTp &Q)
{
    if(parkstack.top==stacksize-1)//栈满
    {
        cout<<"停车位已满,正在进入等候区"<<endl;
        InQueue(Q,num);//等候入队列
    }
    else//入栈
    {
        InStack(parkstack,num);
        cout<<"停车成功"<<endl;
    }

}
void returnstack(SqStackTp &tmpstack,SqStackTp &parkstack)//非目标车从临时栈回车库
{
    int x;
    while(tmpstack.top!=-1)//仍未清空
    {
        x=OutStack(tmpstack);
        InStack(parkstack,x);
    }
}
//指令2--离开停车场
void OUTparking(SqStackTp &parkstack,int num,SqStackTp &tmpstack,QueptrTp &Q)
{
    int i,x,y;
    for(i=1;i<=10;i++)
    {
        x=OutStack(parkstack);//出栈
        if(x==num)
        {
            //是目标车位
            returnstack(tmpstack,parkstack);//非目标车回车库
            cout<<"出车成功!"<<endl;
            if(Q.front!=Q.rear)//有车等待
            {
                y=OutQueue(Q);//出队列
                cout<<y<<"号等待位进入车库"<<endl;
                INparking(parkstack,y,Q);//指令1
            }
            break;
        }


        else if(parkstack.top!=-1){//不是目标车且栈不为空
            InStack(tmpstack,x);  //进入临时栈
        }
        else
        {
            cout<<"未找到该车!!!请重新确认车号"<<endl;
            returnstack(tmpstack,parkstack);//非目标车回车库
            break;
        }
    }




}
void UI1()
{
    cout<<"--------------"<<endl;
    cout<<"请选择操作:1停车  2出车 0退出系统"<<endl;
}
void UI2()
{
    cout<<"请输入车号:"<<endl;
    cout<<"--------------"<<endl;
}
int main()
{
    QueptrTp Q;
    SqStackTp tmpstack;
    SqStackTp parkstack;
    INITQueue(Q);//初始化 等候队列
    INITstack(tmpstack);//初始化 临时栈
    INITstack(parkstack);//初始化 停车栈

    int opration=-1,num,x;

    while(opration!=0){
        UI1();
        cin>>opration;
        if(opration==1)//进车
        {
            UI2();
            cin>>num;
            INparking(parkstack,num,Q);
           // x=OutStack(parkstack);
            //cout<<x<<"测试"<<endl;
        }
        if(opration==2){
            UI2();
            cin>>num;
         OUTparking(parkstack,num,tmpstack,Q);
        }
        if(opration==0)
            break;
    }

 return 0;
}




(三)树型结构题目

  • 树转换成二叉树(以及树的遍历)

这里是星星的code~//拿来学习

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

//树的定义
typedef struct CSNode
{
    char data;
    struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;

//二叉树的定义
typedef struct BTNode
{
    char data;
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;

//栈的定义
typedef struct Stack
{
    CSTree data;
    struct Stack *next;
}Sqstack,*LinkStack;

//队列的定义
typedef struct Sqnode
{
    CSTree data;
    struct Sqnode *next;
}SqNode,*LinkQueue;
typedef struct
{
    LinkQueue front,rear;
}QueueTr;

//先序输入创建一棵树
CSTree CreateCSTree()
{
    char ch;
    CSTree CTp=NULL;
    scanf("%c",&ch);
    if(ch!='0')
    {
        CTp=new CSNode;
        CTp->data=ch;
        CTp->firstchild=CreateCSTree();
        CTp->nextsibling=CreateCSTree();
    }
    return CTp;
}

//树转换成二叉树
BTNode *ExchangeToBTree(CSTree ct)
{
    if(ct==NULL)return NULL;
    else
    {
        BTNode *bt=new BTNode;
        bt->data=ct->data;
        bt->lchild=ExchangeToBTree(ct->firstchild);
        bt->rchild=ExchangeToBTree(ct->nextsibling);
        return bt;
    }
}

//二叉树转换成树
CSTree ExchangeToCSTree(BTNode *bt)
{
    if(bt==NULL)return NULL;
    else
    {
        CSTree ct=new CSNode;
        ct->data=bt->data;
        ct->firstchild=ExchangeToCSTree(bt->lchild);
        ct->nextsibling=ExchangeToCSTree(bt->rchild);
        return ct;
    }
}

//树的先根递归遍历
void preorder_cstree(CSTree ct)
{
    if(ct!=NULL)
    {
        printf("%c",ct->data);
        preorder_cstree(ct->firstchild);
        preorder_cstree(ct->nextsibling);
    }
}
//树的后根递归遍历
void rearorder_cstree(CSTree ct)
{
    if(ct!=NULL)
    {
        rearorder_cstree(ct->firstchild);
        printf("%c",ct->data);
        rearorder_cstree(ct->nextsibling);
    }
}

int StackEmpty(LinkStack s)
{
    if(s==NULL)return 1;
    return 0;
}
void PushStack(LinkStack &s,CSTree p)
{
    LinkStack sq;
    sq=new Sqstack;
    sq->data=p;
    sq->next=s;
    s=sq;
}
void PopStack(LinkStack &s,CSTree &q)
{
    q=s->data;
    s=s->next;
}
//树的先根非递归遍历
void preput_cstree(CSTree ct)
{
    LinkStack S;
    S=NULL;
    CSTree root;
    root=ct;
    while(root!=NULL||!StackEmpty(S))
    {
        if(root!=NULL)
        {
            cout<<root->data;
            PushStack(S,root);
            root=root->firstchild;
        }
        else
        {
            CSTree q;
            PopStack(S,q);
            root=q->nextsibling;
        }
    }
}
//树的后根非递归遍历
void rearput_cstree(CSTree ct)
{
    LinkStack S;
    S=NULL;
    CSTree root;
    root=ct;
    while(root!=NULL||!StackEmpty(S))
    {
        if(root!=NULL)
        {
            PushStack(S,root);
            root=root->firstchild;
        }
        else
        {
            CSTree q;
            PopStack(S,q);
            cout<<q->data;
            root=q->nextsibling;
        }
    }
}

void PushQueue(QueueTr &Q,CSTree ct)
{
    if(ct==NULL)return;
    LinkQueue p;
    p=new SqNode;
    p->data=ct;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
}
void PopQueue(QueueTr &Q)
{
    if(Q.front->next==Q.rear)Q.rear=Q.front;
    Q.front->next=Q.front->next->next;
}
//树的层次序非递归遍历
void cengciput_cstree(CSTree ct)
{
    QueueTr Q;
    Q.front=Q.rear=new SqNode;
    Q.front->next=NULL;
    if(ct==NULL)return;
    PushQueue(Q,ct);
    while(Q.front!=Q.rear)
    {
        LinkQueue p;
        p=Q.front->next;
        cout<<p->data->data;
        PushQueue(Q,p->data->firstchild);
        PushQueue(Q,p->data->nextsibling);
        PopQueue(Q);
    }
}
int main()
{
    CSTree TREE,CT;
    BTNode *BT;
    TREE=CreateCSTree();
    BT=ExchangeToBTree(TREE);
    CT=ExchangeToCSTree(BT);
    cout<<"先根递归遍历树:";
    preorder_cstree(CT);
    cout<<endl;
    cout<<"后根递归遍历树:";
    rearorder_cstree(CT);
    cout<<endl;
    cout<<"先根非递归遍历树:";
    preput_cstree(CT);
    cout<<endl;
    cout<<"后根非递归遍历树:";
    rearput_cstree(CT);
    cout<<endl;
    cout<<"层次非递归遍历树:";
    cengciput_cstree(CT);
    cout<<endl;
    return 0;
}


/*
    a
 b  c  d
e f
*/

/*
#define MAXSIZE 255
static int id=0;
typedef struct //数据的结构体
{
    int id;
    char name[MAXSIZE];
}ElementType;
typedef struct cbtree
{
    ElementType data;
    struct cbtree *firstchilld;//长子节点
    struct cbtree *nextsibling;//兄弟节点
}CbTree;//树节点结构体
int  createcbtree(CbTree*node);//创建树(孩子兄弟法)
void initcbtree(CbTree*tree);//初始化树
void testcbtree();//测试函数
void preordercbtree(CbTree*node);//前序遍历
int main()
{
    testcbtree();//测试函数
    return 0;
}
void initcbtree(CbTree*tree)//初始化树
{
    tree->firstchilld=NULL;//初始化空树的长子节点 为创建孩子节点空间 做前提
    tree->nextsibling=NULL;

}
void testcbtree()//测试函数
{
    CbTree*tree;
    tree=(CbTree*)malloc(sizeof(CbTree));
     if(tree!=NULL)
     {
          initcbtree(tree);
        printf("请输入根节点的数据:\n");
         createcbtree(tree);
         printf("前序遍历的结果为;\n");
         preordercbtree(tree);//遍历树


     }
}
int createcbtree(CbTree*node)//创建树(孩子兄弟法)
{
    char inputname  [MAXSIZE];
     gets(inputname);
      if(strcmp(inputname,"#")==0)
      {
          return 0;
       }

      node->data.id=++id;
      strcpy(node->data.name,inputname);
      node->firstchilld=(CbTree*)malloc(sizeof(CbTree));
       node->nextsibling=(CbTree*)malloc(sizeof(CbTree));
      printf("请输入长子节点");
       if(createcbtree(node->firstchilld)==0)
       {
           free(node->firstchilld);
           node->firstchilld=NULL;

       }
        printf("请输入兄弟节点");
        if(createcbtree(node->nextsibling)==0)
        {
            free(node->nextsibling);
            node->nextsibling=NULL;

        }
        return 1;

}
void preordercbtree(CbTree*node)//前序遍历(孩子兄弟法)
{

        if(node!=NULL){
          printf("[%d,%s]-",node->data.id,node->data.name);
           CbTree*p=node->firstchilld;
          preordercbtree(p);//if的判断用在判断长子节点的结束 便于接下来的兄弟节点的遍历
          //一直遍历长子节点 之后再遍历兄弟节点  长子节点为空 结束长子节点的遍历
           while(p)//长子节点结束 一直遍历兄弟节点  兄弟节点结束再遍历长子节点
           {
               p=p->nextsibling;
               preordercbtree(p);
           }
        }






}
/*if(node==NULL)//采用层次规则创建
      {
         node=(CbTree*)malloc(sizeof(CbTree));
          node->firstchilld=NULL;
          node->nextsibling=NULL;
      }
*/



这里是我未完全实现的…ORZ

#include <bits/stdc++.h>
using namespace std;

#define MAX_TREE_SIZE 100
typedef struct
{
    int data;
    int parent; //双亲位置域
}PTNode;
//双亲表示法树结构
typedef struct
{
    PTNode node[MAX_TREE_SIZE];
    int count;//根的位置和节点个数
}PTree;

void init_ptree(PTree *tree)//初始化树结点
{
    tree->count=-1;
}
typedef struct node
{
    int  data;
    struct node *firstchild,*rightsib;//孩子兄弟
}BTNode,*BTree;

BTNode GetTreeNode(int x)
{
    BTNode t;
    t.data=x;
    t.firstchild=t.rightsib=NULL;
    return t;
}

void print_ptree(PTree T)//输出树
{
    int i;
    cout<<"  序号   节点   双亲 "<<endl;
    for(i=0;i<=T.count;i++)//没到根位置i++
    {
        cout<<"    "<<i<<"      "<<T.node[i].data<<"     "<<T.node[i].parent<<endl;
    }
}

PTree CreateTree(PTree T)
{
    int i=1;
    int fa,ch;
    PTNode p;
    for(i=1;ch!=-1;i++)
    {
        cout<<"输入第"<<i<<"结点"<<endl;
        cin>>fa>>ch;
        cout<<endl;
        p.data=ch;
        p.parent=fa;
        T.count++;//根节点的位置
        T.node[T.count].data=p.data;
        T.node[T.count].parent=p.parent;
    }
    cout<<endl;
    cout<<"创建树的具体情况如下:"<<endl;
    print_ptree(T);
    return T;
}
//转换成二叉树
BTNode *chang(PTree T)
{
    int i,j=0;
    BTNode p[MAX_TREE_SIZE];
    BTNode *ip,*ir,*is,*Tree;//is目标根,ip目标节点,ir连接右兄弟
    ip=new BTNode;
    ir=new BTNode;
    is=new BTNode;
    Tree=new BTNode;
    for(i=0;i<T.count;i++)//得到结点同时初始化first=right=NULL
    {
        p[i]=GetTreeNode(T.node[i].data);
    }
    for(i=1;i<T.count;i++)
    {
        ip=&p[i];//第二个
        is=&p[j];//根
        while(T.node[i].parent!=is->data)//控制同一个父亲,否则跳下一层
        {
            j++;
            is=&p[j];
        }
        if(!(is->firstchild))//长子为空
        {
            is->firstchild=ip;//录入长子
            ir=ip;
        }
        else//次子连接
        {
            ir->rightsib=ip;
            ir=ip;
        }
    }
    Tree=&p[0];//二叉树
    return Tree;
}
//先序输出二叉树
void PrintBTree(BTNode *root)
{
    int i;
    if(root)
    {
        cout<<"---"<<root->data;
        PrintBTree(root->firstchild);
        PrintBTree(root->rightsib);
    }
   // cout<<endl;
}

void Menu()
{
    cout<<endl;
    cout<<"----------------主菜单-----------------"<<endl;
    //cout<<"输入1:-----双亲法创建一个一般树"<<endl;
    cout<<"输入2:-----树的前序遍历(递归)"<<endl;
    cout<<"输入3:-----树的后序遍历(递归)"<<endl;
    cout<<"输入4:-----树的前序遍历(非递归)//写出来了但未调试成功"<<endl;
    cout<<"输入5:-----树的后序遍历(非递归)//写出来了但未调试成功"<<endl;
    cout<<"输入6:-----树的层次遍历(非递归)"<<endl;
    cout<<"输入0:退出程序"<<endl;
    cout<<"---------------------------------------"<<endl;
    cout<<"请输入指令:"<<endl;
}

void Menu2()
{
    cout<<"---------------------------------------"<<endl;
    cout<<"输入0:退出      输入1:继续"<<endl;
    cout<<"请输入指令:"<<endl;
}


void preorder1(BTNode *T)//前序+递归
{
    if(T)
    {
        cout<<T->data<<" ";
        preorder1(T->firstchild);
        preorder1(T->rightsib);
    }
}

void preorder2(BTNode *T)//前序pre非递归2
{
    BTNode *p,*q;
    p=T;
    q=new BTNode;
    stack<BTNode*>S;
    S.push(p);
    while(!S.empty())
    {
        q=S.top();
        cout<<q->data<<" ";
        S.pop();
        if(p->rightsib)
            S.push(p->rightsib);
        if(p->firstchild)
            S.push(p->firstchild);
    }

}

void inorder1(BTNode *T)//树后根递归(中序)
{
    if(T)
    {
        inorder1(T->firstchild);
        cout<<T->data<<" ";
        inorder1(T->rightsib);
    }
}

void inorder2(BTNode *T)//后根非递归
{
    stack<BTree>S;
    BTNode *p,*q;
    p=T;//根指针
    q=new BTNode;
    p=new BTNode;
    while(p||!S.empty())//有一个非空
    {
        if(p)//长子不为空,一直走长子
        {
            S.push(p);//根指针进站
            p=p->firstchild;
        }
        else//左走到底,输出,此时p指向右兄弟
        {
            q=S.top();
            cout<<q->data<<" ";
            S.pop();
            q=S.top();
            p=q->rightsib;
        }

    }
}

void levelorder(PTree T)
{
    int i;
    for(i=0;i<T.count;i++)
        cout<<T.node[i].data<<" ";
    cout<<endl;
}

int main()
{
    int i=0,c1,c2;
    PTree T;
    BTNode *Tree;
    init_ptree(&T);
   // loop;//???
       cout<<"----------------请创建一棵树-----------------"<<endl;
    cout<<"建立一般树,依次输入各结点情况:"<<endl;
                cout<<"输入方式:双亲数据,整型数据(第一个结点双亲为-1,最后以-1结束)"<<endl;
                cout<<"例子:-1,1 1,3"<<endl;
                T=CreateTree(T);
                Tree=chang(T);
                cout<<"一般树转换成二叉树后先序输出:"<<endl;
                PrintBTree(Tree);
                cout<<endl;
                getchar();
   while(c2!=0)
   {
    Menu();
    cin>>c1;
    switch(c1)
    {
        case 2:
                cout<<"树的前序遍历(递归)"<<endl;
                preorder1(Tree);
                break;
        case 3:
                cout<<"树的后序遍历(递归)"<<endl;
                inorder1(Tree);
                break;
        case 4:
                cout<<"树的前序遍历(非递归)"<<endl;
                preorder2(Tree);
                break;
        case 5:
                cout<<"树的后序遍历(非递归)"<<endl;
                inorder2(Tree);
                break;
        case 6:
                cout<<"树的层次遍历(非递归)"<<endl;
                levelorder(T);
                break;
        case 0:
                cout<<"感谢使用QAQ"<<endl;
                exit(1);
                break;
    }
    cout<<endl;
    Menu2();
    cin>>c2;
    }
    cout<<"感谢使用QAQ"<<endl;
    return 0;
}

(四)图型结构题目

  • 行车路线

这里是把大路和小路分开存储,最后取最小值min(大路,小路);
由于小路连续走疲劳度会加和平方,所以预先处理下小路。

#include <bits/stdc++.h>

#define inf 0x3f3f3f3f //无穷大
using namespace std;
long long dl[505][505],xl[505][505];//邻接矩阵
long long dis1[505],dis2[505];
bool jl[505],vis[505];
int n,m;
void floyd()//预处理小路,使得小路最短
{
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		if(xl[i][j]>xl[i][k]+xl[k][j]&&xl[i][k]!=inf&&xl[k][j]!=inf)//i->j比i->k->j路长&&i->k,k->j均有路
		{
			xl[i][j]=xl[i][k]+xl[k][j];//i->j用i->k->j替换
		}
	}
}
int main()
{
	memset(xl,inf,sizeof(xl));
	memset(dl,inf,sizeof(dl));
	//cout<<endl;
	cout<<"===================================欢迎使用========================================="<<endl;
	cout<<endl;
	cout<<"请分别输入路口和道路的个数:"<<endl;
	cin>>n>>m;//n个路口,m道路
	cout<<"请分别输入"<<m<<"个道路"<<"(道路类型(0大路/1小路)  路口1  路口2  路口长度):"<<endl;
	for(int i=1;i<=m;i++)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;//a类型 [b,c] d长度
		if(a==1&&xl[b][c]>d){//小路,目前d小
			xl[b][c]=xl[c][b]=d;//取d
		}
		else if(a==0&&dl[b][c]>d){//大路,目前d小
			dl[b][c]=dl[c][b]=d;//取d
		}
	}
	floyd();
	//初始化起点
    memset(dis1,inf,sizeof(dis1));
	memset(dis2,inf,sizeof(dis2));
	queue<int>q;
	dis1[1]=dis2[1]=0;//小路和大路分别存储比较
	q.push(1);
	vis[1]=1;//起点

	while(!q.empty())//队列不为空
	{
		int now=q.front();
		q.pop();
		vis[now]=0;
		for(int i=1;i<=n;i++)
		{
			long long v=dl[now][i];
			if(dis1[i]>dis1[now]+v)//大路加大路
			{
				dis1[i]=dis1[now]+v;
				if(vis[i])continue;
				vis[i]=1;
				q.push(i);
			}
			if(dis1[i]>dis2[now]+v)//大路加小路
			{
				dis1[i]=dis2[now]+v;
				if(vis[i])continue;
				vis[i]=1;
				q.push(i);
			}
			if(xl[now][i]<1e10)//没懂?
			{
				v=xl[now][i]*xl[now][i];
                //由于xl已经处理过,直接平方就行
				if(dis2[i]>dis1[now]+v)//小路加大路
				{
					dis2[i]=dis1[now]+v;
					if(vis[i])continue;
					vis[i]=1;
					q.push(i);
				}
			}
		}
	}
	cout<<"==================================QAQ感谢使用============================================"<<endl;
	cout<<"最小疲劳度为:"<<endl;
	cout<<min(dis1[n],dis2[n])<<endl;

	return 0;

}
/*
样例1

8 10
1 1 2 2
0 1 3 3
1 2 6 4
0 2 3 2
0 3 4 3
0 4 5 6
1 5 6 4
1 5 7 2
0 6 8 1
1 7 8 3
*/


(五)查找、排序、文件

  • 二叉排序树
#include <bits/stdc++.h>

using namespace std;

struct student
{
    char num[6];
    int grade;
};
typedef student ElemType;
typedef struct BSTNode
{
    ElemType data;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

//全局变量
BSTree pre=NULL;
int n=0;

int found(BSTree T,char ch[])//匹配
{
    BSTree p=T;
    while(p)
    {
        if(strcmp(p->data.num,ch)==0)//姓名相等
        {
            return 1;
        }
        else
        {
            if(strcmp(p->data.num,ch)>0)//前者大
                {pre=p;p=p->lchild;}//查左子树
            else//前者小,找大的
                {pre=p;p=p->rchild;}
        }
    }
    return 0;
}

void insertChild(BSTree &T,ElemType data)
{
    BSTree p;
    if(found(T,data.num)==0)//没有一样的
    {
        p=new BSTNode;
        p->data=data;
        p->rchild=p->lchild=NULL;
        if(!T)//空树
            T=p;
        else if(strcmp(pre->data.num,p->data.num)>0)//前者大,找左子树
        {
            pre->lchild=p;//插左子树
        }
        else//插右子树
            {
                pre->rchild=p;
            }
    }
}

void cindata(BSTree &T)//输入学生数据
{
    int i;
    T=NULL;
    ElemType data;
    cout<<"请输入学生数量:";
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cout<<"请输入第"<<i<<"个学生信息:"<<endl;
        cout<<"学号(char类型):"<<endl;
        cin>>data.num;
        cout<<"成绩:"<<endl;
        cin>>data.grade;
        insertChild(T,data);
    }
    cout<<"录入成功"<<endl;
}

void InOrder(BSTree T)
{
    if(T)
    {
        InOrder(T->lchild);
        cout<<T->data.num<<" "<<T->data.grade<<endl;
        InOrder(T->rchild);
    }
}

int DeepBT(BSTree T)
{
    int depl,depr;
   if(!T)return 0;//出口
   else
   {
        depl=DeepBT(T->lchild);
        depr=DeepBT(T->rchild);
        if(depl>=depr)//左子树>=右子树
            return (depl+1);
        else
            return (depr+1);
   }
}

int leaf(BSTree T)
{
    if(!T)
        return 0;
    else if(!(T->lchild)&&!(T->rchild))
        return 1;
    else
        return leaf(T->lchild)+leaf(T->rchild);
}

int deletee(BSTree &T)//删除节点 重连左/右子树
{
    BSTree q,s;
    if((!T->lchild)&&(!T->rchild))//此时为叶子结点
        T=NULL;
    else if(!T->lchild)//左子树空
        {
            q=T;
            T=T->rchild;
            delete(q);
        }
    else if(!T->rchild)//右子树空
    {
        q=T;
        T=T->lchild;
        delete(q);
    }
    else //左右均不空
        {
            q=T;
            s=T->lchild;//转左子树
            while(s->rchild)//(左子树中)向右走向尽头
            {
                q=s;
                s=s->rchild;
            }
            strcpy(T->data.num,s->data.num);
            if(q!=T)
                q->rchild=s->lchild;
            else
                q->lchild=s->lchild;
            delete(s);
        }
    cout<<"删除成功"<<endl;
    n--;
    return 1;
}


int DeleteBT(BSTree &T,ElemType data)
{
    if(found(T,data.num)==0)
        cout<<"未找到该学生,请重新核对"<<endl;
    else
    {
        if(strcmp(T->data.num,data.num)==0)
            deletee(T);
        else if(strcmp(T->data.num,data.num)>0)//前者大
            return DeleteBT(T->lchild,data);
        else
            return DeleteBT(T->rchild,data);
    }
}
void DELETE(BSTree &T)
{
    ElemType data;
    cout<<"请输入要删除的学生"<<endl;
    cin>>data.num;
    DeleteBT(T,data);
}
void INSERT(BSTree &T)
{
    ElemType data;
    cout<<"请输入新增学生信息:"<<endl;
    cout<<"学号(char类型)"<<endl;
    cin>>data.num;
    cout<<"成绩:"<<endl;
    cin>>data.grade;
    insertChild(T,data);
    n++;
    cout<<"插入成功"<<endl;
}

void SEARCH(BSTree T)
{
    BSTree p=T;
    ElemType data;
    int f=0;
    cout<<"请输入待查询学生的学号:"<<endl;
    cin>>data.num;
    while(p)
    {
        if(strcmp(p->data.num,data.num)==0)
        {
            cout<<"查询记录如下:"<<endl;
            cout<<"学号:"<<p->data.num<<endl;
            cout<<"成绩:"<<p->data.grade<<endl;
            f=1;
            break;
        }
        else if(strcmp(p->data.num,data.num)>0)//前者大
        {
            pre=p;p=p->lchild;
        }
        else
            {
                pre=p;p=p->rchild;
            }
    }
    if(!f)
        cout<<"未查询到该学生!"<<endl;
    return;
}

void GYBcout(BSTree &T)
{
    if(T)
    {
        cout<<T->data.num;
        if(T->lchild||T->rchild)//有不为空的
        {
           // cout<<"(";
            GYBcout(T->lchild);
            if(T->rchild)
                cout<<",";
            GYBcout(T->rchild);
            cout<<")";
        }
        //cout<<")";
    }
}
void Menu()
{
    cout<<"------------二叉排序树操作系统------------"<<endl;
    cout<<"------(1)从键盘输入一组学生记录建立二叉排序树"<<endl;
    cout<<"------(2)中序遍历二叉排序树"<<endl;
    cout<<"------(3)求二叉排序树深度"<<endl;
    cout<<"------(4)求二叉排序树的所有节点数和叶子节点数"<<endl;
    cout<<"------(5)向二叉排序树插入一条学生记录"<<endl;
    cout<<"------(6)从二叉排序树中删除一条学生记录"<<endl;
    cout<<"------(7)从二叉排序树中查询一条学生记录"<<endl;
    cout<<"------(8)以广义表的形式输出二叉排序树"<<endl;
    cout<<"-------------------------------------------"<<endl;
}
void Menu2()
{
    cout<<"输入:0/退出系统  1/继续操作"<<endl;
}
int main()
{
    BSTree T=NULL;
    int option,ff,x;
    while(ff)
    {
        Menu();
        cout<<"请输入操作:"<<endl;
        cin>>option;
        ff=1;
        switch(option)
        {
            case 1:cindata(T);break;
            case 2:InOrder(T);break;
            case 3:{x=DeepBT(T);cout<<"深度为:"<<x<<endl;}break;
            case 4:{x=leaf(T);cout<<"所有节点:"<<n<<"叶子结点数:"<<x<<endl;}break;
            case 5:INSERT(T);break;
            case 6:DELETE(T);break;
            case 7:SEARCH(T);break;
            case 8:GYBcout(T);break;
           // case 0:ff=0;break;
        }

        cout<<endl;
        Menu2();
        cin>>ff;
    }
    cout << "----------------QAQ感谢使用---------------" << endl;
    return 0;
}

这里是归档:2020/12/25

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值