**思路:****通过定义两个头指针使其分别指向小于a和大于等于a的结点
从而将两部分分别进行连接形成两个链表
再将小于a的那一部分的链表的尾指针指向大于等于a的链表的首结点形成一个新链表 ******
/*
时间:2020/08/08
目的:给出一个链表和一个值a ,以a为参照将链表划分成两部分
使所有小于 a的节点都位于大于或等于a的节点之前
两个部分之内的节点之间要保持的原始相对顺序
功能:利用链表解决一些实际问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define A 3
typedef struct list{
int val;
struct list *pnext;
}NODE,*PNODE;
PNODE creatlist(int);
PNODE sort(PNODE,int);
void trase(PNODE);
int main()
{
PNODE pHead;
int len;
printf("输入链表的元素个数:");
scanf("%d",&len);
pHead=creatlist(len);
trase(sort(pHead,A));
return 0;
}
PNODE creatlist(int len){
PNODE pHead=(PNODE)malloc(sizeof(NODE)),p=pHead;
int i,j,val;
for(i=0;i<len;i++){
PNODE q=(PNODE)malloc(sizeof(NODE));
printf("输入值:");
scanf("%d",&val);
q->val=val;
p->pnext=q;
p=q;
}
p->pnext=NULL;
return pHead;
}
PNODE sort(PNODE pHead,int a){
PNODE q1=new NODE();
PNODE q2=new NODE();
PNODE p1=q1,p2=q2,s=pHead->pnext;
while(s!=NULL){
if(s->val<a){//形成一个小于a的值的链表
p1->pnext=s;
p1=s;
}
if(s->val>=a){//形成一个大于等于a的值的链表
p2->pnext=s;
p2=s;
}
s=s->pnext;
}
p1->pnext=q2->pnext;//尾指针指向数值大的链表的首结点
p2->pnext=NULL;//数值大的链表的尾指针被赋值为NULL
return q1;
}
/*
总结:通过定义两个头指针使其分别指向小于a和大于等于a的结点
从而将两部分分别进行连接形成两个链表
再将小于a的那一部分的链表的尾指针指向大于等于a的链表的首结点形成一个新链表
-----------------------
在dev中输出结果为
输入链表的元素个数:6
输入值:1
输入值:4
输入值:3
输入值:2
输入值:5
输入值:2
1 2 2 4 3 5 正确
-----------------------
*/