1、数据结构课程设计参考答案a组/* 二叉树的层次遍历*/#include#include#include #include#define TREEMAX 50typedef struct node char data; struct node *lchild; struct node *rchild; Node;/ 递归创建二叉树Node *CreateBT() Node *t; char x; scanf(%c, &x); fflush(stdin); if(x=#) t=NULL; else t=new Node; t-data=x; printf(tt请输入%c结点的左子结点: ,t-da
2、ta); t-lchild=CreateBT(); printf(tt请输入%c结点的右子结点: ,t-data); t-rchild=CreateBT(); return t;/ 递归先序遍历二叉树void Preorder(Node *T) if(T) printf(%3c,T-data); Preorder(T-lchild); Preorder(T-rchild); / 递归中序遍历二叉树void Inorder(Node *T) if(T) Inorder(T-lchild); printf(%3c,T-data); Inorder(T-rchild); / 递归后序遍历二叉树voi
3、d Postorder(Node *T) if(T) Postorder(T-lchild); Postorder(T-rchild); printf(%3c,T-data); / 非递归先序遍历二叉树void noRecursivePreorder(Node *T) Node *StTREEMAX,*p; int top=-1; if(T!=NULL) top+; Sttop=T; while(top-1) p=Sttop; top-; printf(%c,p-data); if(p-rchild!=NULL) top+; Sttop=p-rchild; if(p-lchild!=NULL)
4、 top+; Sttop=p-lchild; printf(n); / 非递归中序遍历二叉树void noRecursiveInorder(Node *T) Node *StTREEMAX,*p; int top=-1; if(T!=NULL) p=T; while(top-1|p!=NULL) while(p!=NULL) top+; Sttop=p; p=p-lchild; if(top-1) p=Sttop; top-; printf(%c,p-data); p=p-rchild; printf(n); / 非递归后序遍历二叉树void noRecursivePostorder(Node
5、 *T) Node *StTREEMAX,*p; int flag,top=-1; if(T!=NULL) do while(T!=NULL) top+; Sttop=T; T=T-lchild; p=NULL; flag=1; while(top!=-1&flag) T=Sttop; if(T-rchild=p) printf(%c,T-data); top-; p=T; else T=T-rchild; flag=0; while(top!=-1); printf(n); / 层次遍历二叉树,用queue数组充当顺序队列void LevelOrder(Node *T) Node *queu
6、eTREEMAX, *p; int pre=-1, rear=-1; / 树根结点先进队 queue+pre=T; / 当队列不为空时,出队一个结点的同时将其左右孩子进队 while(pre-rear+TREEMAX)%TREEMAX!=0) p=queue+rear; / 出队一个结点并输出 printf(%3c, p-data); if(p-lchild!=NULL) / 左孩子存在则进队 queue+pre=p-lchild; if(p-rchild!=NULL) / 右孩子存在则进队 queue+pre=p-rchild; void list() printf(n); printf(n
7、tt 二叉链表); printf(ntt*); printf(ntt* 1.建立二叉树 *); printf(ntt* 2.递归前序遍历 *); printf(ntt* 3.递归中序遍历 *); printf(ntt* 4.递归后序遍历 *); printf(ntt* 5.非递归前序遍历 *); printf(ntt* 6.非递归中序遍历 *); printf(ntt* 7.非递归后序遍历 *); printf(ntt* 8.层次遍历 *); printf(ntt* 9.清屏 *); printf(ntt* 0.退出程序 *); printf(ntt*); printf(ntt请输入菜单项:)
8、;void main() Node *T=NULL; char a,b; b=m; while(b=m|b=M) list(); scanf(%c, &a); fflush(stdin); switch(a) case1: printf(ntt请按先序序列输入二叉树的结点(输入#表示结点为空):n); printf(ntt请输入根结点:); T=CreateBT(); printf(ntt二叉树成功建立-n); break; case2: printf(ntt该二叉树递归前序遍历为:); Preorder(T); break; case3: printf(ntt该二叉树递归中序遍历为:); I
9、norder(T); break; case4: printf(ntt该二叉树递归后序遍历为:); Postorder(T); break; case5: printf(ntt该二叉树非递归前序遍历为:); noRecursivePreorder(T); break; case6: printf(ntt该二叉树非递归中序遍历为:); noRecursiveInorder(T); break; case7: printf(ntt该二叉树非递归后序遍历为:); noRecursivePostorder(T); break; case8: printf(ntt该二叉树的层次遍历序列为:); Leve
10、lOrder(T); break; case9: system(cls); break; case0: b=n; break; default: printf(ntt*对不起,输入有误!*); /* 多项式运算【链式结构】*/#include stdio.h#include stdlib.htypedef struct _node float coe; int index; struct _node *next; Node, *NodePtr;/ 整理多项式链表,将链表中的结点根据各项指数进行升序排列void sortPoly(NodePtr list) NodePtr p=list-next
11、, q=list, r, ptr; / 让p指向链表的第二个数据结点, / p为空则说明链表为空,不用整理了。 if(p) p=p-next; else return; / 先从链表的第一个数据结点后断开链表 ptr=q-next; ptr-next=NULL; / 再将链表的第二个直至最后一个数据结点依次插入链表 while(p) q=list; ptr=q-next; while(ptr-index index) q=ptr; ptr=ptr-next; if(ptr=NULL) break; if(ptr=NULL) q-next=p; ptr=p; p=p-next; ptr-next
12、=NULL; else if(ptr-index = p-index) ptr-coe += p-coe; r=p-next; free(p); p=r; else if(ptr-index p-index) r=p-next; p-next=ptr; q-next=p; p=r; /* 创建一个多项式链表,返回创建链表的头指针 */NodePtr createPoly() int i=1, index; float coe; NodePtr resultPtr, q; / 开辟头结点空间 resultPtr = (NodePtr)malloc(sizeof(Node); resultPtr-
13、next=NULL; printf(请输入多项式第%d项的系数和指数(输入0 0时结束):, i+); scanf(%f%d, &coe, &index); while(1) if(index & coe=0) printf(系数不能为0!n); else if(index=0 & coe=0) break; else / 开辟新结点空间 q=(NodePtr)malloc(sizeof(Node); q-coe=coe; q-index=index; q-next=NULL; / 将新结点插入多项式链表 q-next=resultPtr-next; resultPtr-next=q; / 输
14、入下一项 printf(请输入多项式第%d项的系数和指数(输入0 0时结束):, i+); scanf(%f%d, &coe, &index); / 将输入的多项式链表整理后返回 sortPoly(resultPtr); return resultPtr;/ 判断多项式链表是否已输入或是否为空int isEmpty(NodePtr list1, NodePtr list2) if(list1=NULL) return 1; else if(list2=NULL) return 2; else if(list1-next=NULL) return -1; else if(list2-next=N
15、ULL) return -2; else return 0;/ 两个多项式相加NodePtr addPoly(NodePtr list1, NodePtr list2) NodePtr resultPtr, p=list1-next, q=list2-next, r; if(isEmpty(list1, list2)=1) printf(多项式链表L1不存在,请先选择菜单1输入多项式L1!n); return NULL; else if(isEmpty(list1, list2)=2) printf(多项式链表L2不存在,请先选择菜单2输入多项式L2!n); return NULL; / 创建
16、结果多项式的头结点 resultPtr=(NodePtr)malloc(sizeof(Node); resultPtr-next=NULL; while(p!=NULL & q!=NULL) if(p-index q-index) / 创建新结点 r=(NodePtr)malloc(sizeof(Node); r-coe=q-coe; r-index=q-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; q=q-next; else if(p-index index) r=(NodePtr)mal
17、loc(sizeof(Node); r-coe=p-coe; r-index=p-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; p=p-next; else / 对应项相加系数不为0 if(p-coe+q-coe!=0) / 创建新结点 r=(NodePtr)malloc(sizeof(Node); r-coe=p-coe+q-coe; r-index=p-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-nex
18、t=r; p=p-next; q=q-next; / 如果某个链表中尚有多余结点尚未插入结果链表, / 则将剩余结点依次插入结果链表 while(p!=NULL) r=(NodePtr)malloc(sizeof(Node); r-coe=p-coe; r-index=p-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; p=p-next; while(q!=NULL) r=(NodePtr)malloc(sizeof(Node); r-coe=q-coe; r-index=q-index; r-
19、next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; q=q-next; return resultPtr;/ 两个多项式相减NodePtr subPoly(NodePtr list1, NodePtr list2) NodePtr resultPtr, p=list1-next, q=list2-next, r; if(isEmpty(list1, list2)=1) printf(多项式链表L1不存在,请先选择菜单1输入多项式L1!n); return NULL; else if(isEmpty(list1, li
20、st2)=2) printf(多项式链表L2不存在,请先选择菜单2输入多项式L2!n); return NULL; / 创建结果多项式的头结点 resultPtr=(NodePtr)malloc(sizeof(Node); resultPtr-next=NULL; while(p!=NULL & q!=NULL) if(p-index q-index) / 创建新结点 r=(NodePtr)malloc(sizeof(Node); r-coe=-1*q-coe; r-index=q-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next;
21、resultPtr-next=r; q=q-next; else if(p-index index) r=(NodePtr)malloc(sizeof(Node); r-coe=p-coe; r-index=p-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; p=p-next; else / 对应项相减系数不为0 if(p-coe-q-coe!=0) / 创建新结点 r=(NodePtr)malloc(sizeof(Node); r-coe=p-coe-q-coe; r-index=p-inde
22、x; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; p=p-next; q=q-next; / 如果某个链表中尚有多余结点尚未插入结果链表, / 则将剩余结点依次插入结果链表 while(p!=NULL) r=(NodePtr)malloc(sizeof(Node); r-coe=p-coe; r-index=p-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; p=p-next; while(q!=NULL)
23、 r=(NodePtr)malloc(sizeof(Node); r-coe=-1*q-coe; r-index=q-index; r-next=NULL; / 将新结点插入结果链表 r-next=resultPtr-next; resultPtr-next=r; q=q-next; return resultPtr;/ 两个多项式相乘NodePtr multiPoly(NodePtr list1, NodePtr list2) NodePtr p, q, r, resultPtr; if(isEmpty(list1, list2)=1) printf(多项式链表L1不存在,请先选择菜单1输入
24、多项式L1!n); return NULL; else if(isEmpty(list1, list2)=2) printf(多项式链表L2不存在,请先选择菜单2输入多项式L2!n); return NULL; else if(isEmpty(list1, list2)=-1 | isEmpty(list1, list2)=-2) / 给相乘的结果多项式链表开辟头结点 resultPtr=(NodePtr)malloc(sizeof(Node); resultPtr-next=NULL; return resultPtr; / 给相乘的结果多项式链表开辟头结点 resultPtr=(NodePtr)malloc(sizeof(Node); resultPtr-next=NULL; p=list1-next; q=list2-next; while(p) / 只要p不为空,则将p指向的结点和另一链表的所有结点相乘, / 并将相乘的每个结点插入到结果链表resultPtr