设一单链表的头指针为head,链表的记录中包含着整数类型的key域,试设计算法,将此链表的记录按照key递减的次序进行就地排序(原地排序)
typedef struct LNode //结点类型定义
{ int data;
int key;
struct LNode *next;
}LNode,*LinkList;
LinkList head; //头指针为head的单链表
void SortLinkList(LinkList &head) //利用冒泡法进行排序
{
LNode *m,*p,*s; //三个指针用来记录位置
int flag=1; //设置标志来判断此排序是否进行交换
m=head;
p=head->next;
if(!p) return; //链表为空,退出结束
s=p->next;
while(m&&flag) //外循环用于判断和进行第X轮排序
{
flag=0; //标志进行复位,表示没有交换
while(p&&s)
{
if(p->key>=s->key)
{
m=p;
p=s;
s=s->next;
}
else
{
p->next=s->next;
s->next=p;
m->next=s;
flag=1;
m=s;
s=p->next;
}
}
m=head;p=head->next;s=p->next;
}
}
将双向链表L拆成两个链表,其中L为头的包含原链表的奇数序号的结点,L1为头的包含原链表的偶数序号结的结点。
LinkList DisCreate(LinkList& L)
{
int i = 0;
LinkList L1 = (LinkList)malloc(sizeof(LNode));
L1->prior = NULL;
L1->next = NULL;
LNode* ra = L, * rb = L1;
LNode* P = L->next;
L->