c语言输入n个数 ,然后奇数按照升序排列,偶数按降序排列

如题所述

由于n不确定,故选择链表存储输入数据,这里选用一个无头结点的链表。编写创建链表、释放链表、排序三个函数,在主函数中调用这些函数来完成。代码如下:

//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
    int n;
    struct node *next;
}*NODE,node;
void freenode(NODE p){//释放链表
    if(p->next) freenode(p->next);
    free(p);
}
NODE CreateLink(void){//创建链表
    int x;
    NODE head,p;
    if((p=head=(NODE)malloc(sizeof(node)))==NULL){//创建头结点
        printf("Establish a head node failure...");
        return NULL;
    }
    printf("Input some data(non-numeric end)...\n");
    while(scanf("%d",&x)==1){
        if((p->next=(NODE)malloc(sizeof(node)))==NULL){
            printf("Failed to create node...");
            freenode(head);
            return NULL;
        }
        p->next->n=x;
        p=p->next;
    }
    p->next=NULL;
    p=head;//删除头结点
    head=head->next;
    free(p);
    return head;
}
void mysort(NODE p){//奇数升排偶数降排
    NODE p1,p2;
    for(;p;p=p->next){
        for(p1=p,p2=p1->next;p2;p2=p2->next)
            if(p->n&1 && p2->n&1 && p1->n>p2->n)
                p1=p2;
            else if(!(p->n&1) && !(p2->n&1) && p1->n<p2->n)
                p1=p2;
        if(p1!=p){
            p1->n^=p->n;
            p->n^=p1->n;
            p1->n^=p->n;
        }
    }
}
int main(void){
    NODE head=CreateLink(),p;
    mysort(head);//按要求排序
    for(p=head;p;p=p->next)//打出来看看
        printf("%d ",p->n);
    freenode(head);
    printf("\n");
    return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-21
用链表进行在线式排序的方法——最快、最有效率的排序方法,比楼上的冒泡排序快好几个数量级,楼上限100个数据,我的程序不限数据量(理论上可达2G个数据进行排序)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct LINK {
int n;
struct LINK * next;
};
typedef struct LINK LNK;
typedef struct LINK * PLNK;
#define szLNK sizeof(struct LINK)

void print(PLNK x)
{
PLNK y = x;
while(y) {
printf("%d ", y->n );
y = y->next;
}
printf("\n");
}

int existed(PLNK root, int m)
{
PLNK y = root;
while(y) {
if (y->n == m) return 1;
y = y->next;
}
return 0;
}

PLNK insert(PLNK root, int m, int (*cmp)(int, int))
{
if(existed(root, m)) return root;

PLNK x = (PLNK)malloc(szLNK);
memset(x, 0, szLNK);
x->n = m;
if (!root) return x;
PLNK y = root;
if (cmp(m, y->n)) {
x->next = y;
return x;
}
while(y) {
if (cmp(m, y->n)) {
x->next = y->next;
y->next = x;
return root;
}
if (!y->next) break;
y = y->next;
}
y->next = x;
return root;
}

int greater(int a, int b) { return a>b; }
int smaller(int a, int b) { return a<b; }

int main(void)
{
PLNK odd = 0; PLNK even = 0; int m = 0;
do {
printf("请输入数据,输入0结束.\n");
scanf("%d", &m);
if (m % 2)
odd = insert(odd, m, &smaller);
else
even =insert(even, m, &greater);
}while(m);
printf("奇数序列:"); print(odd);
printf("偶数序列:"); print(even);
return 0;
}本回答被网友采纳
第2个回答  2010-04-21
#include<stdio.h>
#define MAX 100

void swap(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}

int main()
{
int i,j;
int a[MAX];
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=i;j<n;j++){
if(a[i]%2==0&&a[j]%2==0)
if(a[i]<a[j])swap(&a[i],&a[j]);
if(a[i]%2!=0&&a[j]%2!=0)
if(a[i]>a[j])swap(&a[i],&a[j]);
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
第3个回答  2010-04-21
写个if条件句然后用冒泡排序
希望能帮到你
相似回答