【C語言】——給出一個鏈表和一個值 ,以 爲參照將鏈表劃分成兩部分,使所有小於 的節點都位於大於或等於 的節點之前。 兩個部分之內的節點之間要保持的原始相對順序

2020-08-09 13:45:33

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