1、编写递归算法int max(int a[],int left, int right),求数组a[left..right]中的最大数。
/* 编写递归算法int max(int a[],int left, int right),求数组a[left..right]中的最大数。*/
#include "ArrayIo.h"
/*请将本函数补充完整,并进行测试*/
int max(int a[],int left,int right)
{
int lmax,rmax,mid;
if (left==right) return a[left];
else
{
mid=(left+right)/2;
lmax=max(a,left,mid);
rmax=max(a,mid+1,right);
return lmax>rmax?lmax:rmax;
}
}
int main()
{ int a[10];
input(a,10);
print(a,10);
printf("数组的最大数是:%d\n",max(a,0,9));
return 0;
}
2、请编写一个递归算法函数void partion(int a[], int left, int right),将数组a[left..right]中的所有奇数调整到表的左边,所有偶数调整到表的右边。
/*请编写一个递归算法函数void partion(int a[], int left, int right),
将数组a[left..right]中的所有奇数调整到表的左边,所有偶数调整到表的右边。*/
#include "ArrayIo.h"
#define N 10
/*请将本函数补充完整,并进行测试*/
void partion(int a[], int left,int right)
{
int x;
if (left<right)
{
while (left<right && a[left]%2==1)
left++;
while (left<right && a[right]%2==0)
right--;
if (left<right)
{
x=a[left];
a[left]=a[right];
a[right]=x;
partion(a,left+1,right-1);
}
}
}
int main()
{ int a[N];
init(a,N); /*随机产生N个数*/
print(a,N);
partion(a,0,N-1);
print(a,N);
return 0;
}
3、请编写递归函数void bubbleSort(int a[],int n),对长度为n的数组采用冒泡法进行升序排序。请编写递归函数int binSearch(int a[], int left, int right,int key), 采用二分查找法在数组a[left..right]中查找值为key的元素所在的位置,若查找失败函数返回-1。
/* 请编写递归函数void bubbleSort(int a[],int n),
对长度为n的数组采用冒泡法进行升序排序。
请编写递归函数int binSearch(int a[], int left, int right,int key),
采用二分查找法在数组a[left..right]中查找值为key的元素所在的位置,
若查找失败函数返回-1。 */
#include "ArrayIo.h"
#define N 10
/*请将本函数补充完整,并进行测试*/
void bubbleSort(int a[],int n)
{ int i,t;
int flag;
if(n>0)
{
flag=0;
for(i=0;i<n-1;i++)
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
flag=1;
}
}
if (flag==1) bubbleSort(a,n-1);
}
return ;
}
int binSearch(int a[], int left,int right,int key)
{
int mid;
if (left>right)
return -1;
else
{
mid=(left+right)/2;
if (a[mid]==key)
return mid;
else
if (key<a[mid])
return binSearch(a,left,mid-1,key);
else
return binSearch(a,mid+1,right,key);
}
}
int main()
{ int x,pos,a[N];
init(a,N);
bubbleSort(a,N);
print(a,N);
printf("请输入要查找的数:\n");
scanf("%d",&x);
pos=binSearch(a,0,N-1,x);
if (pos!=-1) printf("a[%d]=%d\n",pos,x);
else printf("Not found!\n");
return 0;
}
4、已知带头结点的单链表结构定义同实验3,假设链表中所有结点值均不相同,请编写一个递归函数linklist max(linklist head),返回表中最大数所在的结点地址,若链表为空,返回NULL。
/*已知带头结点的单链表结构定义同实验3,假设链表中所有结点值均不相同,
请编写一个递归函数linklist max(linklist head),返回表中最大数所在的结点地址,若链表为空,返回NULL。*/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist max(linklist head)
{
linklist m;
if (head->next==NULL)
return NULL;
else
if (head->next->next==NULL)
return head->next;
else
{
m=max(head->next);
return head->next->info > m->info ? head->next:m;
}
}
int main()
{ linklist head,p;
head=creatbyqueue();
print(head);
p=max(head);
if (p)
printf("max=%d\n",p->info);
else
printf("链表为空\n");
return 0;
}
Arraylo.h代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*对长度为n的整型数组作输入*/
void input( int a[],int n)
{ int i;
printf("请输入 %d 个整数:\n",n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
}
/*输出长度为n的整型数组*/
void print(int a[ ],int n)
{ int i;
printf("\n数组的内容是:\n");
for (i=0;i<n;i++)
{ if (i%10==0) printf("\n");
printf("%6d",a[i]);
}
printf("\n");
}
void init(int a[],int n)
{ int i;
srand(time(NULL));
for (i=0;i<n;i++)
a[i]=rand()%1000;
}
slnklist.h代码
#include <stdio.h>
#include <stdlib.h>
/**************************************/
/* 链表实现的头文件,文件名slnklist.h */
/**************************************/
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
typedef node *linklist;
/******************************************/
/*函数名称:creatbystack() */
/*函数功能:头插法建立带头结点的单链表 */
/******************************************/
linklist creatbystack()
{
linklist head,s;
datatype x;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d",&x);
while (x!=0)
{
s=(linklist)malloc(sizeof(node));
s->info=x;
s->next=head->next;
head->next=s;
scanf("%d",&x);
}
return head;
}
/***************************************/
/*函数名称:creatbyqueue() */
/*函数功能:尾插法建立带头结点的单链表 */
/***************************************/
linklist creatbyqueue()
{
linklist head,r,s;
datatype x;
head=r=(linklist)malloc(sizeof(node));
head->next=NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d",&x);
while (x!=0)
{
s=(linklist)malloc(sizeof(node));
s->info=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
/**********************************/
/*函数名称:print() */
/*函数功能:输出带头结点的单链表 */
/**********************************/
void print(linklist head)
{
linklist p;
int i=0;
p=head->next;
printf("List is:\n");
while(p)
{
printf("%7d",p->info);
i++;
if (i%10==0) printf("\n");
p=p->next;
}
printf("\n");
}
/******************************************/
/*函数名称:creatLink() */
/*函数功能:从文件中读入n个数据构成单链表 */
/******************************************/
linklist creatLink(char *f, int n)
{
FILE *fp;
int i;
linklist s,head,r;
head=r=(linklist)malloc(sizeof(node));
head->next=NULL;
fp=fopen(f,"r");
if (fp==NULL)
return head;
else
{
for (i=0;i<n;i++)
{
s=(linklist)malloc(sizeof(node));
fscanf(fp,"%d",&(s->info));
r->next=s;
r=s;
}
r->next=NULL;
fclose(fp);
return head;
}
}
/**********************************/
/*函数名称:delList() */
/*函数功能:释放带头结点的单链表 */
/**********************************/
void delList(linklist head)
{ linklist p=head;
while (p)
{ head=p->next;
free(p);
p=head;
}
}