题目:
解析:
此题时一个关于带头双向链表的问题,并且加入了选择排序的知识。
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct DList
{
int data;
struct DList* next;
struct DList* prev;
}DL;
DL* DLInit(DL** ps)
{
//创建带哨兵位的头结点
*ps = (DL*)malloc(sizeof(DL));
(*ps)->next = *ps;
(*ps)->prev = *ps;
return *ps;
}
void DListCreate(DL** ps, int n)
{
DL* cur = *ps;
DL* newHead = cur;
int x = 0;
while (n)
{
scanf("%d", &x);
getchar();
DL* newnode = (DL*)malloc(sizeof(DL));
newnode->data = x;
newHead->prev = newnode;
newnode->next = newHead;
cur->next = newnode;
newnode->prev = cur;
cur = newnode;
n--;
}
}
void DListSort(DL** ps)
{
//用直接选择排序
DL* head = *ps;
DL* prev = head->next;
DL* cur = prev->next;
while (prev != head)
{
while (cur != head)
{
if (cur->data < prev->data)
{
int tmp = cur->data;
cur->data = prev->data;
prev->data = tmp;
}
cur = cur->next;
}
prev = prev->next;
cur = prev->next;
}
}
void DListPrint(DL** ps)
{
DL* cur = (*ps)->next;
while (cur != *ps)
{
printf("%d ", cur->data);
cur = cur->next;
}
}
int main()
{
DL* plist = DLInit(&plist);
int n = 0;
scanf("%d", &n);
getchar();
DListCreate(&plist, n);
DListSort(&plist);
DListPrint(&plist);
return 0;
}