题目:
(1)用随机函数生成10个3位整数(100~999),把这些整数存于单链表中,然后读入一个整数,以该值为基准把单链表分割为两部分,所有小于该值的结点排在大于或等于该值的结点之前。
思路:
先建立链表,将数据输入链表,再根据分割值,建立min和max链表,大于分割值部分添加入max链表,其余加入min链表,再将min链表的尾部连接max的首即可
源代码:
#include "pch.h"
#include <iostream>
#include<ctime>
using namespace std;
struct List//链表
{
int data;
List *next;
};
void init(List *&L)//初始化链表
{
L = new List;
L->next = NULL;
}
void push(List *&L, int data)//存入数据
{
List *tmp = new List;
tmp->data = data;
tmp->next = NULL;//建立节点
List*p = L;
while (p->next)
{
p = p->next;
}
p->next = tmp;//插入到链表末尾
}
List* partion(List *&L, int data)//分割链表
{
if (L == NULL || L->next == NULL) return L;
List* min, *max;//建立小于data和大于data的两个链表
init(min);
init(max);
List*pmin = min;
List*pmax = max;
L = L->next;
while (L)//遍历链表
{
if (L->data < data) {//如果小于data,则放进min链表
pmin->next = L;
pmin = pmin->next;
L = L->next;
pmin->next = NULL;
}
else//否则,放进max链表
{
pmax->next = L;
pmax = pmax->next;
L = L->next;
pmax->next = NULL;
}
}
pmin->next = max->next;//最后将min链表的尾部连接max的首
return min;//返回min链表
}
int main()
{
srand(unsigned int(time(0)));
List *L;
init(L);
for (int i = 0; i < 10; i++)//将数据插入链表
{
int data = rand() % 899 + 100;
push(L, data);
cout << "随机数" << data << "已插入到链表尾部\n";
}
cout << "请输入一个整数分割列表:";
int data;
cin >> data;//输入分割值
L=partion(L, data);//分割链表
List*p = L->next;
cout << "分割后链表顺序如下所示:\n";
for(int i=1;i<=10;i++)//输出分割后链表
{
cout <<"第"<<i<<"个数为:"<< p->data << endl;
p = p->next;
}
}