单链表实现前半段是奇数,后半段是偶数排序
单链表实现前半段是奇数,后半段是偶数排序
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
// 单链表结点定义
typedef struct LNode {
int data;
struct LNode* next;
}LNode;
// 尾插法建立单链表
void createlistR(LNode *&C, int a[], int n)
{
LNode* s, * r;
int i;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;
r = C;
for (i = 0; i < n; ++i)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
// 打印单链表
void printlist(LNode* C)
{
LNode* s = C->next;
while (s != NULL)
{
printf("%d\t", s->data);
s = s->next;
}
printf("\n");
}
// 所有奇数在前,偶数再后
void sortOddAndEven(LNode*& C)
{
LNode* forge, *meta,* odd, * even,*joint;
// 建立带头结点的奇数列
odd = (LNode*)malloc(sizeof(LNode));
odd->next = NULL;
// 建立带头结点的偶数列
even = (LNode*)malloc(sizeof(LNode));
even->next = NULL;
forge = C->next;
while (forge!= NULL)
{
meta = forge;
forge = forge->next;
// 判断数据是否为奇数
if (meta->data % 2 == 1)
{
meta->next = odd->next;
odd->next = meta;
}
else {
meta->next = even->next;
even->next = meta;
}
}
joint = odd->next;
// 全部为偶数
if (joint == NULL)
{
C->next = even->next;
return;
}
while (joint->next != NULL)
{
joint = joint->next;
}
C->next = odd->next;
joint->next = even->next;
}
void main()
{
// 建立带头结点的单链表
LNode* C;
int arr[] = { 15, 48, 44, 78,423,44,17 };
int n = 7;
createlistR(C, arr, n);
// 打印
printlist(C);
sortOddAndEven(C);
// 打印
printlist(C);
}

浙公网安备 33010602011771号