mirror of
https://github.com/xusun0623/exam_code_for_408.git
synced 2026-02-02 18:09:04 +08:00
add 2019
This commit is contained in:
67
code_cross_2019.cpp
Normal file
67
code_cross_2019.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user