收藏 分享(赏)

数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc

上传人:scg750829 文档编号:6454162 上传时间:2019-04-13 格式:DOC 页数:16 大小:88.50KB
下载 相关 举报
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc_第1页
第1页 / 共16页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc_第2页
第2页 / 共16页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc_第3页
第3页 / 共16页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc_第4页
第4页 / 共16页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第六章答案.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、6.1/*题目:已知 An为整数数组,编写一个递归算法求 n 个元素的平均值设计:狼影时间;2012.10.1*/# include # define size 100float sum = 0;/函数声明float cal_average(int *a,int i,int n);main()int n;int i;float average;int asize;/输入数据的个数printf(“输入数据的个数n“);scanf(“%d“, /输入 n 个数据printf(“输入数据n“);for(i = 0; i=n)return (sum/n);elsesum += ai;return (c

2、al_average(a, i+1, n);/*输入数据的个数5输入数据1 2 3 4 5平均数数 3.000000Press any key to continue*/6.2/*题目;有一个不带表头结点的单链表,设计如下的递归算法:(下面的代码实现的顺序为了方便可能与问题的顺序不一致)1.求以 h 为头指针的单链表的节点的个数2.正向显示以 h 为头指针的单链表的所有节点值3.反向显示以 h 为头指针的单链表的所有节点值4.删除以 h 为头指针的单链表中值为 x 的第一个节点5.删除以 h 为头指针的单链表中值为 x 的所有节点6.输出以 h 为头指针的单链表中最大节点值7.输出以 h 为头

3、指针的单链表中最小节点值设计;狼影时间:2012.10.1*/# include # include /节点类型按课本上的来写typedef int ElemType;typedef struct nodeElemType data;struct node *next;NODE;int number = 0;/函数声明NODE *creat_list(void);void front_output(NODE *pHead);void back_output(NODE *pHead);int node_number(NODE *pHead);int cal_max(NODE *pHead);in

4、t cal_min(NODE *pHead);NODE *delete_x(NODE *pHead, int x);NODE *delete_all_x(NODE *pHead, int x);main()NODE *pHead;int max, min;int number, x;int sert;/首先先创建一个链表printf(“输入数据按 0 结束n“);pHead = creat_list();if(pHead!=NULL)/下面正向输出内容printf(“正向输出的结果是n“);front_output(pHead);printf(“n“);/反向输出链表内容printf(“反向输

5、出的结果是n“);back_output(pHead);printf(“n“);/求节点的个数number = node_number(pHead);printf(“节点的个数是%dn“, number);/输出最大值max = cal_max(pHead);printf(“最大值是%dn“, max);/求最小值min = cal_min(pHead);printf(“最小值是%dn“, min);/删除链表中值为 x 的第一个元素printf(“输入删除的元素值n“);scanf(“%d“, doprintf(“删除所有的 x 按 1, 首个 x 按 0n“);scanf(“%d“, wh

6、ile(sert1);switch(sert)case 0:pHead = delete_x(pHead, x);printf(“剩余的节点是n“);front_output(pHead);printf(“n“);break;case 1:pHead = delete_all_x(pHead, x);printf(“剩余的节点是n“);front_output(pHead);printf(“n“);break;elseprintf(“链表为空n“);/递归创建链表NODE *creat_list(void)ElemType n;NODE *pNow;scanf(“%d“, if(0=n)ret

7、urn NULL;elsepNow = (NODE *)malloc(sizeof(NODE);if(NULL=pNow)printf(“内存分配失败n“);exit(-1);pNow-data = n;pNow-next = creat_list();return pNow;/正向输出链表内容void front_output(NODE *pHead)if(NULL=pHead)return;elseprintf(“%d “, pHead-data);front_output(pHead-next);/反向输出链表的内容void back_output(NODE *pHead)if(NULL

8、 = pHead)return;elseback_output(pHead-next);printf(“%d “, pHead-data);/求节点的个数int node_number(NODE *pHead)if(NULL=pHead)return 0;elsereturn (node_number(pHead-next)+1);/求最大值int cal_max(NODE *pHead)int max, max1;if(pHead-next=NULL)max = pHead-data;elsemax = pHead-data;max1 = (cal_max(pHead-next);max =

9、 (maxmax1)? max:max1;return max;/求最小值int cal_min(NODE *pHead)int min, min1;if(pHead-next = NULL)min = pHead-data;elsemin = pHead-data;min1 = cal_min(pHead-next);min = (mindata != x)pHead-next = delete_x(pHead-next, x);return pHead;elsepNow = pHead;pHead = pHead-next;free(pNow);return pHead;/删除所有的 x

10、节点NODE *delete_all_x(NODE *pHead, int x)NODE *pNow;if(pHead!=NULL)if(pHead-data!=x)pHead-next = delete_all_x(pHead-next, x);return pHead;elsepNow = pHead;pHead = pHead-next;free(pNow);return delete_all_x(pHead, x);elsereturn NULL;/*输入数据按 0 结束1 2 3 4 2 7 20正向输出的结果是1 2 3 4 2 7 2反向输出的结果是2 7 2 4 3 2 1节点

11、的个数是 7最大值是 7最小值是 1输入删除的元素值2删除所有的 x 按 1, 首个 x 按 01剩余的节点是1 3 4 7Press any key to continue*/另加皇后的问题(仅供参考)/*题目:采用递归求解皇后的问题(n*n)实践:狼影时间:2012.10.1*/# include # include # define size 20/函数的声明void place(int row,int n);bool is_set(int row, int i);void print(int n);int setsize;int number = 0;main()int n;print

12、f(“输入 n 的大小n“);scanf(“%d“, place(0,n);printf(“八皇后安放的方式有%d 种n“, number);/安放皇后void place(int row,int n)int i;if(row=n)print(n);number+;fflush(stdin);getchar();for(i = 0; i# include # define size 256char map1010 = #, #, #, #, #, #, #, #, #, #,#, 0, 0, 0, 0, 0, 0, 0, 0, #,#, #, 0, #, #, #, 0, #, 0, #,#,

13、 #, 0, #, 0, 0, 0, #, 0, #,#, 0, 0, 0, 0, 0, 0, #, 0, #,#, 0, #, #, 0, #, 0, 0, 0, #,#, 0, #, #, 0, 0, 0, #, #, #,#, 0, #, #, #, 0, 0, 0, 0, #,#, 0, 0, 0, 0, 0, #, #, 0, #,#, #, #, #, #, #, #, #, #, #;/定义节点typedef struct int x;int y;int di;STATE;typedef struct STATE statesize;int top;STACK;int sin =

14、 0; /标记是不是有路径int number = 0;int max = 65535;int clea;STATE arrysize;/存放最短路径STATE clsize;/存放最后的一条路径/函数的声明STACK *init_stack(void);void find_path(STACK *stack);void push_stack(STACK *stack, STATE st);bool is_empty(STACK *stack);void get_top(STACK *stack, STATE *st);bool is_through(STATE st);void pop_st

15、ack(STACK *stack);void print_map(void);void shortest_path(STACK *stack);void clear_map(void);void re_paint(void);main()STACK *stack;stack = init_stack();printf(“地图的入点是(1,1)出口点是(8,8)n“);find_path(stack);if(0 = sin)printf(“没有路径n“);elseprintf(“一共有%d 条路径n“, number);printf(“最短路径是n“);re_paint();print_map(

16、);printf(“n“);/寻找路径void find_path(STACK *stack)/将入口点入栈STATE st;st.x = 1;st.y = 1;st.di = -1;push_stack(stack, st);mapst.xst.y = 1;while(!is_empty(stack)get_top(stack, if(8=st.x /有路径的话 sin 标记为 1print_map();printf(“n“);number+;shortest_path(stack);mapstack-statestack-top.xstack-statestack-top.y = 0;po

17、p_stack(stack);elsewhile(st.distatestack-top.x-1;st.y = stack-statestack-top.y;break;case 1: st.x = stack-statestack-top.x;st.y = stack-statestack-top.y+1;break;case 2: st.x = stack-statestack-top.x+1;st.y = stack-statestack-top.y;break;case 3: st.x = stack-statestack-top.x;st.y = stack-statestack-t

18、op.y-1;break;default: break;stack-statestack-top.di = st.di; /记录当前点走向哪个方向的相邻点if(is_through(st)st.di = -1;push_stack(stack, st);mapst.xst.y = 1;elsemapstack-statestack-top.xstack-statestack-top.y = 0;pop_stack(stack);/初始化队列STACK *init_stack(void)STACK *stack = (STACK *)malloc(sizeof(STACK);if(NULL =

19、stack)printf(“内存分配失败n“);exit(-1);stack-top = -1;return stack;/入队列void push_stack(STACK *stack, STATE st)stack-top+;stack-statestack-top.di = st.di;stack-statestack-top.x = st.x;stack-statestack-top.y = st.y;/判断空bool is_empty(STACK *stack)if(-1 = stack-top)return true;elsereturn false;/获得栈顶元素void get

20、_top(STACK *stack, STATE *st)if(is_empty(stack)printf(“栈空n“);return;st-x = stack-statestack-top.x;st-y = stack-statestack-top.y;st-di = stack-statestack-top.di;/判断是不是可以通过bool is_through(STATE st)if(0 = mapst.xst.y)return true;elsereturn false;/出栈操作void pop_stack(STACK *stack)if(is_empty(stack)printf

21、(“栈空n“);return;elsestack-top-;/打印地图void print_map(void)int i, j;for(i = 0; itop; i+)cli = stack-statei;clea = stack-top;/记下最短的路径坐标if(stack-top top;for(i = 0; itop; i+)arryi = stack-statei;/绘制最短路径地图void re_paint(void)int i;clear_map();for(i = 0; i=max;i+)maparryi.xarryi.y = 1;/将地图还原void clear_map(void)int i;for(i = 0; i=clea; i+)mapcli.xcli.y = 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报