【C语言】——给出一个链表和一个值 ,以 为参照将链表划分成两部分,使所有小于 的节点都位于大于或等于 的节点之前。 两个部分之内的节点之间要保持的原始相对顺序

**思路:****通过定义两个头指针使其分别指向小于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      正确 
----------------------- 
*/ 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值