#include "LinkList.cpp" //现单链表的各种基本运算的算法文件单链表的基本运算算法_yyy_zxc的博客-CSDN博客
void Split02(LinkNode *&L,ElemType x){
LinkNode *p=L->next; //p指针作为旧表的第一个结点,作用类似于头指针
LinkNode *s=p->next; //s指针永远指向p的下一个结点
LinkNode *r=L; //r指针指向新表的尾结点
LinkNode *n=L; //n记录第一个小于x结点的地址
L->next = NULL; //因为p指针已保存第一个结点地址,所以旧表数据不会丢失
//此时L指针指向空,相当于一个新表
while(p != NULL){
if(p->data < x){
p->next = L->next; //如果旧表p结点值小于x,则将其插入新表头结点后面
L->next = p;
if(p->next == NULL)
r=p; //如果p结点插入后为尾结点,则使r指向p
n=n->next;
}
else if(p->data > x){
p->next = r->next; //如果大于x则将其插入新表尾结点后面
r->next = p;
r = r->next;
}
else{ //如果等于x则将其插入第一个小于x结点的后面
p->next=n->next;
n->next=p;
}
p=s;
if(s != NULL) //判断p是否是最后一个结点
s=p->next;
}
}
int main(){
LinkNode *h;
ElemType b[]={1,2,1,3,6,3,8,5};
InitList(h); //初始化
ListInsertF(h,b,8); //建表
DispList(h); //输出表
Split02(h,3);
printf("--------------------------\n");
DispList(h); //输出表
DestoryList(h); //释放表
运行结果:
书上代码:
void Split01(LinkNode *&L,ElemType x){
LinkNode *p=L->next,*q,*r;
L->next=NULL;
r=L;
while(p != NULL){
if(p->data <x ){
q=p->next;
p->next=L->next;
L->next=p;
if(p->next == NULL)
r=p;
p=q;
}
else{
r->next=p;
r=p;
p=p->next;
}
}
r->next = NULL;
}
运行结果
书上的算法Split01存在一个bug,数据按顺序存储时x才作为分界点
Split02在书上代码的基础上,增加了一个对p->data ==x的判断,并将其插入第一个小于x的结点的后面