**思路:****通過定義兩個頭指針使其分別指向小於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 正確
-----------------------
*/