单链表实现前半段是奇数,后半段是偶数排序

单链表实现前半段是奇数,后半段是偶数排序

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

  

 

posted @ 2021-12-29 15:45  Daniel_shi  阅读(312)  评论(0编辑  收藏  举报