单链表实现前半段是奇数,后半段是偶数排序
单链表实现前半段是奇数,后半段是偶数排序
#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); }