【大神】把给定链表中最大数据项移动到该表中的最后一个节点

Fire_Sky_Ho 2017-09-25 01:01:40
反正找到最大项所在结点
把这个结点移动到表最后



//创建的链表,剩下移动不会了,求解
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 5;
struct Node
{
int data;
Node *next;
};
int main()
{
srand ( time ( 0 ) );
int i;
Node *head, *p;
head = new Node;
int a[5]={6,14,2,5,6};
for ( i = 0, p = head; i < N; i++ )
{
p->next = new Node;
p = p->next;
p->next = nullptr;
p->data = a[i];
}

p = head->next;
while ( p )
{
cout << &(p->data) << "\t";
p = p->next;
}
cout << endl;
...全文
472 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sty_app 2017-09-26
  • 打赏
  • 举报
回复
引用 5 楼 Fire_Sky_Ho 的回复:
[quote=引用 4 楼 sty_app 的回复:] 楼主的问题,有歧义啊。 两种理解:初始布局【6,14,2,5,6】 1.只将最大的值抽离出来,放到最后,最终布局为【6,2,5,6,14】 2.循环查找最大项,并移到最后,最终布局为【2,5,6,6,14】
就是第一种,地址也会变到最后面去[/quote] 环境VS2008

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 5;
struct Node
{
	int data;
	Node *next;
};

int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	Node *head, *p;
	head = new Node;
	int a[5]={6,14,2,14,6};
	for ( i = 0, p = head; i < N; i++ )
	{
		p->next = new Node;
		p = p->next;
		p->next = NULL;
		p->data = a[i];
	}
	p = head->next;
	while ( p )
	{
		cout << &(p->data) << "\t";
		p = p->next;
	}
	cout << endl;

	// 查找最大值
	Node* max;
	int flag = 0; //相同最大值数量
	int maxValue = 1<<(sizeof(int)*8-1);
	for(p = head->next; p != NULL; p = p->next)
	{
		if(p->data > maxValue)
		{
			max = p;
			maxValue = p->data;
			flag = 1;
		}
		else if(p->data == maxValue)
		{
			max = p;
			flag++;
		}
	}
	// 删除最大值(如果存在相同最大值的情况,删除前面所有相同的,保留最后一个最大值)
	for(p = head; p->next != NULL; p = p->next)
	{
		if(p->next->data == maxValue)
		{
			Node* tmp = p->next;
			p->next = p->next->next;
			if(flag > 1)
			{
				delete tmp;
				flag--;
			}
		}
	}
	if(p->next == NULL)
		p->next = max; // 最后的位置放上最大值
	max->next = NULL;
	//

	p = head->next;
	while ( p )
	{
		cout << &(p->data) << "\t";
		p = p->next;
	}
	cout << endl;
	// 退出程序前,将链表中所有节点释放(切记,自己New的内存,一定要释放)
	p = head;
	while ( p )
	{
		Node* tmp = p;
		p = p->next;
		delete tmp;
		tmp = NULL;
	}
	return 0;
}
赵4老师 2017-09-25
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
Fire_Sky_Ho 2017-09-25
  • 打赏
  • 举报
回复
引用 3 楼 qq_29846883 的回复:
void move_max(std::vector<node*>& v)
{
	int last = v.size() - 1;
	int max = 0;
	for (int i =0; i<last;i++)
	{
		if (v[i]->data < v[i + 1]->data)
		{
			max = i + 1;
		}
	}
	auto tmp = v[last];
	v[last] = v[max];
	v[max] = tmp;
}
没测试,自己改下测试
我要包括结点地址也变到最后面去,就是那一整块,都变后面去
Fire_Sky_Ho 2017-09-25
  • 打赏
  • 举报
回复
引用 4 楼 sty_app 的回复:
楼主的问题,有歧义啊。 两种理解:初始布局【6,14,2,5,6】 1.只将最大的值抽离出来,放到最后,最终布局为【6,2,5,6,14】 2.循环查找最大项,并移到最后,最终布局为【2,5,6,6,14】
就是第一种,地址也会变到最后面去
qq_29846883 2017-09-25
  • 打赏
  • 举报
回复
void move_max(std::vector<node*>& v)
{
	int last = v.size() - 1;
	int max = 0;
	for (int i =0; i<last;i++)
	{
		if (v[i]->data < v[i + 1]->data)
		{
			max = i + 1;
		}
	}
	auto tmp = v[last];
	v[last] = v[max];
	v[max] = tmp;
}
没测试,自己改下测试
sty_app 2017-09-25
  • 打赏
  • 举报
回复
楼主的问题,有歧义啊。 两种理解:初始布局【6,14,2,5,6】 1.只将最大的值抽离出来,放到最后,最终布局为【6,2,5,6,14】 2.循环查找最大项,并移到最后,最终布局为【2,5,6,6,14】
零隐 2017-09-25
  • 打赏
  • 举报
回复
这不是链表里面的问题吗。 查找最大索引,获取数据, 在最后插入获取数据,删除原有数据。
ztenv 版主 2017-09-25
  • 打赏
  • 举报
回复
你的问题是什么?

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧