数据结构—实验五(递归)

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;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值