11.设C={a1,b1,a2,b2,......an,bn}为线性表,采用带头节点的hc单链表存放,
设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,..........,an},B={b1,b2,........,bn};
/*
将一个带头节点单链表分解成两个带头结点的单链表A和B,
使得A中含有原表中序号为奇数的元素,B中为偶数,
分析:
首先我们分配一个节点空间为B作为头节点,然后设置一个flag,
flag为0时认为奇数,链给A,flag为1时认为偶数,链给B
*/
#include<stdio.h>
#include<stdlib.h>
#include"LinkStruct.h"//通过自创建文件引入结构体,ctrl+鼠标左键点击即可查看
void divide(Link *lb,Link *la){
int flag=0;//做奇偶判定,因为奇数之后一定是偶数,偶数之后一定试奇数
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->next;
}
ra->next=NULL;
//要记得将末尾节点的指针指向NULL,不然就任然是之前的指针,导致结果不正确
rb->next=NULL;
}
int main(){
Link *head;
Link *createLink(int);
void printfNowLink(Link *);
head=createLink(0);
Link *b=(Link*)malloc(sizeof(Link));
divide(b,head);
printfNowLink(b);
printf("\n");
printfNowLink(head);
return 0;
}