设计题目:一单位员工通讯录管理系统一、题目要求为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。
其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
二、概要设计本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。
三、主要代码及分析这里面关于链表的主要的操作有插入,查询,删除。
则这里只列出这几项的主代码。
1、通过建立通讯录结构体,对信息进行存储,建立链表,建立信息之间的联系。
typedef struct { }DataType;结构体来存储通讯录中的基本信息typedef struct node{ DataType data; /*结点的数据域*/struct node *next; /*结点的指针域*/}ListNode,*LinkList;2、信息插入操作,将信息查到链表的后面。
void ListInsert(LinkList list){ //信息插入ListNode *w;w=list->next;while(w->next!=NULL){ w=w->next; }ListNode *u=new ListNode;u->next=NULL;cout<<"员工编号:";cin>>u->data.num;cout<<"员工姓名:";cin>>u->;cout<<"手机号码:";cin>>u->data.call;cout<<"员工邮箱:";cin>>u->data.email;cout<<"办公室电话号码:";cin>>u->data.phone;w->next=u;w=w->next;}3、信息删除操作void ListDelete(LinkList list){ //删除ListNode *c1;ListNode *c2;ListNode *c3;c1=list;c2=list;int s=0;char Schax[20];cout<<"-------------------------------------------------------"<<endl;cout<<"请输入要删除的员工编号:";cin>>Schax;while((strcmp(Schax,c1->data.num))){s++; c1=c1->next; }for(int j=0;j<s-1;j++){ c2=c2->next; }c3=c2->next;c2->next=c3->next;}4、查询void Traverse(LinkList list){ //查询ListNode *s;s=list->next;int a=0;cout<<"按员工编号查询,请输入员工编号:";char num[20];cin>>num;do{if(!(strcmp(num,s->data.num)))//Q=H,strcmp(Q,H) ==0;Q>H, strcmp(Q,H) == 1;Q<H, strcmp(Q,H) == -1;{cout<<"员工编号:"<<s->data.num<<endl;cout<<"员工姓名:"<<s-><<endl;cout<<"手机号码:"<<s->data.call<<endl;cout<<"员工邮箱:"<<s->data.email<<endl;cout<<"办公室电话号码:"<<s->data.phone<<endl;return;a++;}}while(s->next!=NULL,s=s->next);if (a==0){cout<<"小凤温馨提示~~~~~~您输入的信息不存在!"<<endl;} }四、运行结果及分析插入操作及其结果查询修改(修改结果)删除五、设计心得体会通过这次设计,又温习了一下链表的基本操作,对链表的增删改查的基本内容都有了一定的掌握,为以后的编程打好了基础。
设计题目:二线索二叉树一、题目要求1.建立中序线索二叉树,并且中序遍历;2. 求中序线索二叉树上已知结点中序的前驱和后继;本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。
二、概要设计这个是对线索二叉树的编程,首先要熟悉掌握线索二叉树的基本原理,在n个结点的二叉链表中含有n+1个空指针。
因为含n个结点的二叉链表中含有2n个指针,除了根结点,每个结点都有一个从父结点指向该结点的指针,因此一共使用了n-1个指针,所以在n个结点的二叉链表中含有2n-(n-1)=n+1个空指针。
因此,可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。
这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。
为了区分一个结点的指针是指向其孩子的指针,还是指向其前驱或后继结点的线索,可在每个结点中增加两个线索标志。
三、主要代码及分析1、建立二叉树int CreatBiTree(Bitree &T)//先序创建二叉树{ //该节点非空返回1,双亲节点对应标志Link,//空时返回0,双亲节点对应标志应为ThreadTElemType ch;cin>>ch;if(ch=='#'){ T=NULL; return 0; }else{if(!(T=(BitNode *)malloc(sizeof(BitNode)))){ cout<<"存储分配失败"<<endl;exit(1); }T->data=ch;if(CreatBiTree(T->lchild)) T->LTag=Link;else T->LTag=Thread;if(CreatBiTree(T->rchild)) T->RTag=Link;else T->RTag=Thread;}return 1;}2、中序线索遍历二叉树。
void InThreading(Bitree p)//中序遍历线索化二叉树,如果一个结点没有左孩子,则将其指向其前驱,如果没有右孩子,则将其指向其后继。
{if(p!=NULL){InThreading(p->lchild);//左子树线索化if(p->lchild==NULL) //前驱线索{ p->LTag=Thread; p->lchild=pre; }if(pre->rchild==NULL)//后继线索{ pre->RTag=Thread;pre->rchild=p;}pre=p; //保持pre指向p的前驱InThreading(p->rchild);//右子树线索化}}int InOrderThreading(Bitree &Thrt,Bitree T){//中序遍历线索化二叉树T,并将其中序线索化,Thrt指向头节点Thrt=(Bitree)malloc(sizeof(BitNode));//申请头结点地址if(Thrt==NULL) exit(1);Thrt->LTag=Link; //建立头结点Thrt->RTag=Thread;Thrt->rchild=Thrt;//右指针回指if(T==NULL) Thrt->lchild=Thrt;//若二叉树为空,则左指针回指else{Thrt->lchild=T; //头结点指向树的根pre=Thrt;InThreading(T); //中序遍历线索化二叉树pre->rchild=Thrt;//二叉树的最后一个结点的后继结点指向thrt.pre->RTag=Thread;//最后一个结点的线索化Thrt->rchild=pre;}return 1;}3、输出各结点前驱和后继Bitree InPre(Bitree p)//前驱,{Bitree q;q=p->lchild;//遍历其左子树。
if(p->LTag==Thread)//若标志为1,则左链为线索,只是其前驱。
return(p->lchild);if(q==NULL)//如果左链为空,则无前驱。
{ return NULL; }while(q->RTag==Link)//遍历左子树最后访问的一个结点,即左子树中最右下的结点。
{ q=q->rchild; }return (q);}//后继Bitree InNext(Bitree p)//遍历右子树时访问的第一个结点。
{ B itree q;q=p->rchild;//遍历其右子树。
if(p->RTag==Thread)return(p->rchild);if(q==NULL){ return NULL; }while(q->LTag!=Thread){ q=q->lchild; }return(q);}//InNext//输出前驱和后继值函数。
int Traverse_Thr(Bitree T){int i=0;Bitree p;p=T->lchild;cout<<"前驱 "<<"节点 "<<"后继 "<<"顶点序号"<<endl;while(p!=T)//空树或遍历结束时p==T{while(p->LTag==Link)p=p->lchild;//找中序遍历的第一个点,并输出其前驱和后继。
cout<<InPre(p)->data<<" ";//找其前驱并输出。