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, #,#, #, 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, #,