链表划分

来源:互联网 发布:苟是什么意思网络 编辑:程序博客网 时间:2024/06/06 00:35

题目:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

思路:创建两个链表分别存放小于x、大于x的结点,再合并两个链表

c语言具体实现:

#include<stdio.h>#include<stdlib.h>#include"myList.h"myList partationbyX(myList L,myList R,int x){myList beforeStart,afterStart,p,next;R = (myList)malloc(sizeof(myList));p = L->next;beforeStart = afterStart = NULL;while(p != NULL){next = p->next;//保存后继结点 if(p->data <x){p->next = beforeStart;beforeStart = p;}else{p->next = afterStart;afterStart = p; }p = next;}if(beforeStart == NULL){R->next = afterStart;}else{p = beforeStart;//保存头结点 while(p->next!= NULL)//寻找尾结点 p = p->next;p->next = afterStart;R->next = beforeStart;}return R;} void traverse(myList L){myList p = L->next;while(p != NULL){printf("%d->",p->data);p = p->next;}printf("NULL\n");}void createList(myList &L){L = (myList)malloc(sizeof(myList));L->next = NULL;}int main(){myList L,p,q,R;createList(L);q = L;elemType a;int x;while(1){scanf("%d",&a);if(a != 100){p = (myList)malloc(sizeof(myList));if(p == NULL)return 0;else{p->data = a;p->next = q->next;q->next = p;q = p;}}elsebreak;}traverse(L);printf("请输入整数x\n");scanf("%d",&x);traverse(partationbyX(L,R,x));return 0;}



0 0