请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(C和C++)
已知非空线性链表第1个链结点指针为list,链结点构造为
struct node{
datatype data;
node *link;
};
请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(注意:要求先写出算法的解题思路,然后再写出算法)
【输入形式】
输入为一个整数序列(个数<100),整数(int)之间以空格隔开,序列以回车结尾。
【输出形式】
输出为移动后的整数序列,整数之间以空格隔开,序列以回车结尾。
【样例输入】
3 12 4 9 5 1
【样例输出】
3 4 9 5 1 12
【样例说明】
将序列中最大的数字12移动到序列最后。 展开
算法:
先创建一个链表;
再找出链表中最大数字所在的结点(并保持记录最大结点的前趋结点t);
利用t将最大最大结点从原链表中删除,再将最大结点链接到原来的表尾。
#include<stdio.h>
#include<string.h>
typedef struct node
{ int data;
struct node* link;
} aaa;
aaa * creat()
{ aaa *h,*p,*q;
int x;
char c,k=1;
p=h=(aaa*)malloc(sizeof(aaa));
do
{ scanf("%d%c",&x,&c);
q=(aaa*)malloc(sizeof(aaa));
q->data=x;
p->link=q;
p=q;
}
while(c!='\n');
p->link=NULL;
return h;
}
void movemax(aaa *p)
{ aaa *t=p,*max=p->link,*q=p;
while(p->link)
{ p=p->link;
if(p->data>max->data)
{ t=q;
max=p;
}
q=p;
}
t->link=max->link;;
p->link=max;
max->link=NULL;
}
void prt(aaa *p)
{ while(p=p->link)
{ printf("%d ",p->data);
}
printf("\n");
}
int main()
{ aaa *h;
h=creat();
movemax(h);
prt(h);
return 0;
}