Test

#include <iostream>

using namespace std;

///////////////////////////////

struct Node

{

int info;

Node *pNext;

};

struct NodeList

{

Node *pHead;

Node *pTail;

};

Node *newNode(int n)

{

Node *pNew = new Node;

pNew->pNext = NULL;

pNew->info = n;

return pNew;

}

void addToHead(NodeList &list, Node *node)

{

if (list.pHead == NULL)

{

list.pHead = list.pTail = node;

}

else

{

node->pNext = list.pHead;

list.pHead = node;

}

}

void addToTail(NodeList &list, Node *node)

{

if (list.pTail == NULL)

{

list.pHead = list.pTail = node;

}

else

{

list.pTail->pNext = node;

list.pTail = node;

}

}

void input(NodeList &list)

{

int n = 0;

cout << “Nhap vao du lieu: (se dung nhap khi du lieu la so am)” << endl;

while (n >= 0)

{

cin >> n;

addToTail(list, newNode(n));

}

}

void Display(NodeList &list)

{

Node *p = list.pHead;

while( p != NULL)

{

cout << p->info << endl;

p = p->pNext;

}

}

void SapXepTang(NodeList &list)

{

Node *p, *X;

NodeList list1, list2;

if (list.pHead == list.pTail)

{

return;

}

list1.pHead = list1.pTail = NULL;

list2.pHead = list2.pTail = NULL;

X = list.pHead;

list.pHead = X->pNext;

while (list.pHead != NULL)

{

p = list.pHead;

list.pHead = p->pNext;

p->pNext = NULL;

if (p->info <= X->info)

addToTail(list1, p);

else

addToTail(list2, p);

}

SapXepTang(list1);

SapXepTang(list2);

if (list1.pHead != NULL)

{

list.pHead = list1.pHead;

list1.pTail->pNext = X;

}

else

{

list.pHead = X;

}

X->pNext = list2.pHead;

if (list2.pHead != NULL)

{

list.pTail = list2.pTail;

}

else

{

list.pTail = X;

}

}

Node *getHead(NodeList &l)

{

Node *p;

if (l.pHead != NULL)

{

p = l.pHead;

l.pHead = l.pHead->pNext;

p->pNext = NULL;

if (l.pHead == NULL)

{

l.pTail = NULL;

}

}

else

{

return NULL;

}

return p;

}

void Partition(NodeList &l1, NodeList &l2, NodeList &l)

{

Node *p = l.pHead->pNext;

Node* a;

int x;

if (p != NULL)

{

cout << “Nhap vao x bat ki: “;

cin >> x;

while (p != NULL)

{

a = getHead(l);

if(a->info >= x)

{

addToTail(l1, a);

p = p->pNext;

}

else

{

addToTail(l2, a);

p = p->pNext;

}

}

}

}

int main()

{

NodeList list, L1, L2;

list.pHead = NULL;

list.pTail = NULL;

L1.pHead = NULL;

L1.pTail = NULL;

L2.pHead = NULL;

L2.pTail = NULL;

input(list);

cout << “————-Du lieu da nhap————-” << endl;

Display(list);

SapXepTang(list);

cout << “———Du lieu sau khi sap xep———” << endl;

Display(list);

Partition(L1

, L2, list);

cout << “L1 (danh sach nhung du lieu >= x) la: ” << endl;

Display(L1);

cout << “L2 (danh sach nhung du lieu < x) la: ” << endl;

Display(L2);

system(“pause”);

return 0;

}

Leave a comment