From 57fbb00ad67cf2e93005d5f2f22cd06007765e88 Mon Sep 17 00:00:00 2001 From: xusun000 <2235861811@qq.com> Date: Mon, 29 Nov 2021 17:21:11 +0800 Subject: [PATCH] add 2019 --- code_cross_2019.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 code_cross_2019.cpp diff --git a/code_cross_2019.cpp b/code_cross_2019.cpp new file mode 100644 index 0000000..c04232f --- /dev/null +++ b/code_cross_2019.cpp @@ -0,0 +1,67 @@ +#include +#include + +typedef struct node { + int data; + struct node* next; +} NODE; + +//通过数组创建链表 +void create(node* n, int length, int pos, int data[]) { + if (pos < length) { + n->data = data[pos];//赋给struct中的data + node* next = (node*)malloc(sizeof(node));//动态分配下一个节点地址 + n->next = next;//对下一个节点采用递归构建 + create(n->next, length, pos + 1, data);//递归,pos位置+1 + } + else { + n->data = -1;//最后一个节点使用-1作为标识 + } +} + +void cross_sort(node* n, int length) { + //对后半部分就地逆置 + node* mid = n; + node* start = n; + int i; + for (i = 0;i < length / 2;i++)mid = mid->next;//找到中间节点 + //从中间开始逆置链表 + node* s, * t; + s = mid->next; + mid->next = NULL; + while (s->data != -1) { + //将s节点摘下来 + t = s; + s = s->next; + //将摘下来的节点头插到mid节点之后 + t->next = mid->next; + mid->next = t; + } + node* tmp = mid; + mid = mid->next;//后移 + tmp->next = NULL; + i++; + while (i++ < length && mid != NULL) { + node* p, * q; + //使用p、q暂存start和mid节点 + p = start->next; + q = mid->next; + //将mid指针所指节点单独摘下来,注意:要将尾巴(next)甩掉,不然结果不对 + mid->next = NULL; + //插到start节点后面 + start->next = mid; + mid->next = p; + //同时移动start和end指针 + start = p; + mid = q; + } + mid = NULL; +} + +int main() { + node* a = (node*)malloc(sizeof(node)); + int d[] = { 1,2,3,4,5,6,7,8 }; + create(a, 8, 0, d); + cross_sort(a, 8); + return 0; +} \ No newline at end of file