Tạo danh sách liên kết đôi có n phần tử ngẫu nhiên
Sắp xếp = phương pháp đổi chổ trực tiếp
[AH]
[/AH]
Sắp xếp = phương pháp đổi chổ trực tiếp
[AH]
Mã:
//++++++++++++++++++++++++++++++++++++++++//
// Please don't remove if you use Code //
// TapLamHacker VFO.VN //
//++++++++++++++++++++++++++++++++++++++++//
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<conio.h>
int n;
struct Node
{
int data;
Node *pNext;
Node *pPre;
};
struct List
{
Node *pHead;
Node *pTail;
};
Node *GetNode(int a)
{
Node *p = new Node;
p->data = a;
p->pNext = NULL;
p->pPre = NULL;
return p;
}
void AddTail(List &L,Node *a)
{
if(L.pHead == NULL)
{
L.pHead = a;
L.pTail = L.pHead;
}
else
{
L.pTail->pNext = a;
a->pPre = L.pTail;
L.pTail = a;
}
}
void CreateList(List &L, int n)
{
while(n != 0)
{
int tmp = 1 + rand()%100;
Node *p = new Node;
p = GetNode(tmp);
AddTail(L,p);
n--;
}
}
void OutList(List L, int n)
{
Node *p = new Node;
p = L.pHead;
while(n!=0)
{
printf("%d ",p->data);
p = p->pNext;
n--;
}
}
void Sort(List &L)
{
int dem = 0;
int dem1 = 0;
for(Node *p = L.pHead ; p->pNext != NULL; p= p->pNext)
{
for(Node *q = p->pNext ; q != NULL ; q = q->pNext)
{
if(p->data > q->data)
{
Node *tmp = new Node;;
tmp =GetNode(q->data);
tmp->pNext = p->pNext;
tmp->pPre = p->pPre;
if(p->pPre != NULL)
p->pPre->pNext = tmp;
else
L.pHead = tmp;
p->pNext->pPre = tmp;
p->pNext = q->pNext;
p->pPre = q->pPre;
if(q->pNext != NULL)
q->pNext->pPre = p;
else
L.pTail = p;
q->pPre->pNext = p;
p = tmp;
}
}
}
}
int main()
{
List L;
L.pHead = NULL;
L.pTail = NULL;
printf("Input n:");
scanf("%d",&n);
srand(time(NULL));
CreateList(L,n);
printf("List before Sort: \n");
OutList(L,n);
printf("\n");
Sort(L);
printf("\n");
printf("List after Sort: \n");
OutList(L,n);
printf("\n");
char *_="%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c";
int __=3**_+5;
printf("\n\n\t\ \t\t");
printf(_,__+59,__-32,__-19,__-4,__-21,__-40,__+17,__-7,__-21,__-44,__-19,__-17,__-9,__-15,__-2,__+58);
getch();
}