
/*
将一个带头结点单链表A分解成两个带头结点的单链表A和B,使得A中含有原表中序号为奇数的元素,B中为偶数,且保持其相对位置不变
分析:
首先我们需要分配一个节点空间为B作为头节点,然后设置一个flag,为0时认为是奇数,链给A,为1时认为是
偶数,连给B
*/
struct Link {
int data;
struct Link *next;
};
#include <stdio.h>
#include <stdlib.h>
void divide(Link *lb,Link *la) {
int flag = 0;//做奇偶判定,因为奇数之后一定是偶数,偶数之后一定是奇数
struct Link *l=la, *p = la->next,*rb=lb,*ra=l;
l->next = NULL;//原链表头结点置空
while (p) {//要使其顺序不变,采用尾插法
if (!flag) {
ra->next = p;
ra = p;
flag = 1;
}
else {
rb->next = p;
rb = p;
flag = 0;
}
p = p->next;
}
ra->next = NULL;//要记得将末尾节点的指针指向NULL,不然就仍然是之前的指针,导致结果不正确
rb->next = NULL;
}
int main() {
struct Link *head;
Link *createLink(int);
void printfNowLink(Link *);
head = createLink(0);
struct Link *b = (struct Link*)malloc(sizeof(struct Link));//开辟节点空间
divide(b,head);
printfNowLink(b);
printf("\n");
printfNowLink(head);
return 0;
}