荷兰国旗(单链表版)
作者:
yuyi417
,
2023-03-08 22:11:25
,
所有人可见
,
阅读 173
#include<iostream>
#include<windows.h>
using namespace std;
const int N = 1e5+10;
typedef struct LNode
{
int data;
struct LNode* next;
}LinkNode;
//尾插法-按输入顺序
void CreateList(LinkNode* &L,int a[],int n)
{
LinkNode* s, * r;
L = (LinkNode*)malloc(sizeof(LinkNode));
r = L;
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void color(int n) //调整控制器颜色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n);
return;
}
void DispList(LinkNode*& L)
{
LinkNode* p = L->next;//工作指针p初始化
while (p != NULL)
{
if (p->data == 0) color(207);
if (p->data == 1) color(240);
if (p->data == 2) color(158);
cout << p->data;
color(15);//程序结束后的颜色需要重置一下
p = p->next;
}
}
void move2(LinkNode *&L)
{
LinkNode *L1,*L2,*r,* r1,* r2,* p;
L1 = NULL;
L2 = NULL;
r1 = NULL;
r2 = NULL;
p = L->next;
r = L;
while (p != NULL)
{
if (p->data == 0)
{
r->next = p; r = p;
}
else if (p->data == 1)
{
if (L1 == NULL)
{
L1 = p; r1 = p;
}
else
{
r1->next = p; r1 = p;
}
}
else //p->data==2
{
if (L2 == NULL)
{
L2 = p; r2 = p;
}
else
{
r2->next = p; r2 = p;
}
}
p = p->next;
}
r->next = r1->next;
r1->next = r2->next;
r2->next = NULL;
r->next = L1; //L的尾结点和L1的首结点链接起来
r1->next = L2; //L1的尾结点和L2的首结点链接起来
}
void DestroyList(LinkNode*& L)
{
LinkNode* pre = L, * p = L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
int main()
{
int n;
int a[N];
string b;
cout << "请输入想要输入的元素个数:";
cin >> n;
cout << "请输入要输入的元素:" << endl;
cin >> b;
for (int i = 0; i < b.size(); i++) a[i] = (b[i] - '0');
LinkNode *L;
CreateList(L,a,n);
cout << "调整前的原始顺序:" << endl;
DispList(L);
cout << endl;
move2(L);
cout << "调整后的顺序:" << endl;
DispList(L);
DestroyList(L);
}