C语言-单链表的结点移动
【问题描述】
已知一带头结点的非空单链表,请写一算法将该链表中数据域值最大的那个结点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)
【输入形式】
输入为:整数序列中整数的个数,整数序列。每个数之间以空格隔开。
【输出形式】
输出为:移动后的整数序列,整数之间以空格隔开。
【样例输入】
6 3 12 4 9 5 1
【样例输出】
3 4 9 5 1 12
【样例说明】
将序列中最大的数字12移动到序列最后
【评分标准】本题需由输入数据构建单链表。不使用链表的将不得分。
#include<iostream>
#include<stdlib.h>
#define LEN sizeof(struct Data)
using namespace std;
struct Data //定义一个结构体
{
int x;
struct Data *next;
};
int main()
{
int n;
struct Data *head;
struct Data *creat(int x); //声明建立链表的函数,返回值为指针
struct Data *Move(struct Data *head); //声明函数,实现移动
void Print(struct Data *head); //函数声明,输出链表
cin >> n; //输入元素个数,也可用scanf语句
head = creat(n);
head = Move(head);
Print(head);
system("pause"); //因为集成开发环境的原因,添加此语句,使执行窗口暂停
return 0;
}
struct Data *creat(int x)
{
struct Data *head, *p1, *p2;
int n;
head = (struct Data *)malloc(LEN);
head->x = x;
p1 = p2 = (struct Data *)malloc(LEN);
for (n = 1; n <= x; n++)
{
cin >> p1->x;
if (n == 1)
head->next = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Data *)malloc(LEN);
}
p2->next = NULL;
free(p1);
return head;
}
void Print(struct Data *head)
{
struct Data *p;
for (p = head->next; p != NULL; p = p->next)
{
cout << p->x << " ";
}
cout << endl;
}
struct Data *Move(struct Data *head)
{
struct Data *p, *p1, *p2, *p3;
int max;
max = head->next->x;
p = p1 = p2 = p3 = NULL;
for (p = head->next, p2 = head; p != NULL; p = p->next, p2 = p2->next)
{
if (max <= p->x) //寻找最大值,并记下当前位置
{
max = p->x;
p1 = p; //p1为最大值的指针
p3 = p2; //p3为最大值的前一个指针
}
}
if (p1->next != NULL)
{
p3->next = p1->next;
p2->next = p1;
p1->next = NULL;
}
else
p1->next = NULL;
return head;
}
运行案例1:最大元素在中间
运行案例2:最大元素是最后一个
运行案例3:最大元素是第一个
说明:
1.需考虑最大元素的位置
2.使用malloc函数返回的是一个空指针,需用强制类型转换,转换为指向结构体的指针。