思路: 分为三步,找,删,头插
找最大值,因为头插法每次都是插入一个头结点。
第一步查找
for (q = pm = h, p = h->next;p;q = p,p = p->next)
{
if (p->date > pm->date)
{
pm = p;
qm = q;
}
}
q,p联动跑,qm始终是pm的前驱
第二步删除(不free)
if (pm - h)
qm->next = pm->next;
else
h = h->next;
删中间尾前驱挂后继
删头 移动头指针
第三步 头插
pm->next = h1;
h1 = pm;
代码如下
运行环境:VS2017
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
ElemSN*SelectMax(ElemSN*h)
{
ElemSN *p = NULL, *q = NULL, *pm = NULL, *qm = NULL, *h1 = NULL;
q = pm = h;
p = h->next;
while (h)
{
for (q = pm = h, p = h->next;p;q = p,p = p->next)
{
if (p->date > pm->date)
{
pm = p;
qm = q;
}
}
if (pm - h)
qm->next = pm->next;
else
h = h->next;
pm->next = h1;
h1 = pm;
}
return h1;
}
int main(void)
{
int a[6] = { 3,2,5,8,4,7 };
ElemSN*head, *h1;
head = GreatLink(a, 6);
PrintLink(head);
h1 = SelectMax(head);
PrintLink(h1);
system("pause");
}
运行结果: 3 2 5 8 4 7
2 3 4 5 7 8