C语言题目13

//有两列数字, A{1,2,3,4,5,6,7,8,9}   B{10,11,12,13,14,15} 
//合并成一个新的数列C,要求所有的奇数排在所有的偶数前面,
//并且奇数要升序,偶数要降序,输出数列C到屏幕上

#include"stdio.h"
int getminodd(int c[], int start, int n)
{
  int k;
  int minodd = start;
  while(c[minodd]%2 == 0)
    {
      minodd = minodd+1;
      if(minodd == n)
	{
	  break;
	}
    }
  if(minodd != n)
    {
      for(k=minodd; k<n; k++)
	{
	  if((c[minodd]>c[k]) && c[k]%2 == 1)
	    {
	      minodd = k;
	    }
	}
    } 
  return minodd;
}

int getmaxeven(int c[], int start, int n)
{
  int k;
  int maxeven = start;
  while(c[maxeven]%2 != 0)
    {
      maxeven = maxeven+1;
      if(maxeven == n)
	{
	  break;
	}
    }
  if(maxeven != n)
    {
      for(k=maxeven; k<n; k++)
	{
	  if((c[maxeven]<c[k]) && c[k]%2 == 0)
	    {
	      maxeven = k;
	    }
	}
    } 
  return maxeven;
}

int main()
{
  int a[9] = {1,2,3,4,5,6,7,8,9};
  int b[6] = {10,11,12,13,14,15};
  int c[15] = {};
  int i;
  int j;
  int k=0;
  int count=0;
  int minodd=0;
  int maxeven=0;
  int swap;
  //合并
  for(i=0; i<9; i++)
    {
      c[k] = a[i];
      k = k+1;
    }
  for(j=0; j<6; j++)
    {
      c[k] = b[j];
      k = k+1;
    }
  //奇数部分选择排序
  while(1)
    {
      minodd = getminodd(c, count, 15);
      if(minodd == 15)
	{
	  break;
	}
      swap = c[count];
      c[count] = c[minodd];
      c[minodd] = swap;
      count = count+1;
      if(count >= 15)
	{
	  break;
	}
    }
  //偶数部分选择排序
  while(1)
    {
      maxeven = getmaxeven(c, count, 15);
      if(maxeven == 15)
	{
	  break;
	}
      swap = c[count];
      c[count] = c[maxeven];
      c[maxeven] = swap;
      count = count+1;
      if(count >= 15)
	{
	  break;
	}
    }
  //输出
  for(k=0; k<15; k++)
    {
      printf("%d ", c[k]); 
    }
  printf("\n");
  return 1;
}

C语言题目3

//用C编写程序:输入一系列整数,保存这些整数,将所有奇数放在所有偶数之前,并且奇数部分和偶数部分需要按从小到大顺序排列,最后输出。
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
  int x;
  struct node *next;
}llnode;

llnode* getNumberList()//此函数建立临时链表,用来接收用户输入
{
  int number = 0;
  llnode *head = (llnode *)malloc(sizeof(llnode));
  llnode *p = head;
  p->x = 0;
  p->next = NULL;
  printf("请输入一列整数,数字之间用空格隔开,以输入#并回车结束:");
  while(scanf("%d", &number))
    {
      llnode *n = (llnode *)malloc(sizeof(llnode));
      n->x = number;
      n->next = NULL;
      p->next = n;
      p = n;
      head->x ++;
    }
  return head;
}

int* getNumberArray(llnode *head)//此函数用来处理用户输入,把用户输入从链表转移到动态数组,以便后面的操作
{
  llnode *p = head;
  llnode *q = head;
  int *numberarray;
  int i;
  numberarray = (int *)malloc(sizeof(int)*(head->x));
  p = head->next;
  while(p!=NULL)
    {
      numberarray[i] = p->x; 
      i++;
      p = p->next;
    }
  return numberarray;
}
  
void removeNumberList(llnode *head)//此函数用于删除临时链表,释放空间
{
  llnode *p = head;
  llnode *q = head;
  while(p!=NULL)
    {
      q = p->next;
      free(p);
      p = q;
    }
}

void divideNumberArray(int *numberarray, int n)//此函数用于把奇数放到偶数的前面
{
  int start = 0;
  int end = n-1;
  int swap = 0;
  for(start=0; start<end; start++)
    {
      if(numberarray[start]%2 == 0)
	{
	  for(; end>start; end--)
	    {
	      if(numberarray[end]%2 == 1)
		{
		  swap = numberarray[start];
		  numberarray[start] = numberarray[end];
		  numberarray[end] = swap;
		  break;
		}
	    }
	}
    }
}

int getCut(int* numberarray, int n)//此函数用于得到奇数和偶数的划分点
{
  int i = 0;
  for(i=0; i<n; i++)
    {
      if(numberarray[i]%2 == 0)
	{
	  return i;
	}
    }
}

void sortNumberArray(int* numberarray, int start, int end)//此函数用于对指定范围内的数据进行升序排序
{
  int i = 0;
  int j = 0;
  int min = 0;
  int swap = 0;
  for(i=start; i<=end; i++)
    {
      min = i;
      for(j=i+1; j<=end; j++)
	{
	  if(numberarray[j] < numberarray[min])
	    {
	      min = j;
	    }
	}
      swap = numberarray[min];
      numberarray[min] = numberarray[i];
      numberarray[i] = swap;
    }
}

int main()
{
  int i = 0;
  int nodecount = 0;
  int *numberarray;
  int cut = 0;
  llnode *head;
  head = getNumberList();//由于不确定用户输入数据的多少,所以要采用链表,这样就解决了不知道用户会输入多少个数字的情况
  nodecount = head->x; //记录一下用户输入了多少数据
  numberarray = getNumberArray(head);//把临时链表的数据放到动态数组以便后续的处理
  removeNumberList(head);//至此numberarray存储了用户输入的所有数据,我们可以把之前的链表删除了,要不然会浪费内存资源
  //至此我们可以专心处理数组numberarry了,nodecount是数组元素个数
  divideNumberArray(numberarray, nodecount);//把奇数放到偶数的前面
  cut = getCut(numberarray, nodecount);//得到奇数和偶数的划分点
  sortNumberArray(numberarray, 0, cut-1);//对奇数排序
  sortNumberArray(numberarray, cut, nodecount-1);//对偶数排序
  for(i=0; i<nodecount; i++)//输出结果
    {
      printf("%d ", numberarray[i]);
    }
  printf("\n");
  return 0;
}