C++ 实现链表常用功能

首先头文件,定义了链表的常用函数:

typedef struct node
{
	int data;
	struct node* next;
} Node;

class LinkListUtil
{
public:
	LinkListUtil();
	~LinkListUtil();

	//create
	Node* createByArray(int arr[], int len);

	int getLenght(Node *head);

	void println(Node *head);

	Node* remove(Node *head, int num);

	//Insert element into the link list by the index.
	//if index is -1 then insert the num into the link list end.
	Node* insert(Node *head, int num, int index = -1);

	Node* sort(Node *head);

	Node* reserve(Node *head);

	Node* removeHead(Node *head);
};

然后是实现:

#include "stdafx.h"
#include "LinkListUtil.h"

LinkListUtil::LinkListUtil()
{
}

LinkListUtil::~LinkListUtil()
{
}

Node* LinkListUtil::createByArray(int arr[], int len)
{
	//Declare head node, previous node, new node.
	Node *head, *p, *n;

	//Init head node.
	head = new Node();

	p = head;

	for (int i = 0; i < len; i++)
	{
		n = new Node();
		n->data = arr[i];
		p->next = n;
		p = n;
	}
	head = head->next;
	//head->next = nullptr;	//?
	return head;
}

int LinkListUtil::getLenght(Node *node)
{
	int len = 0;
	Node *temp = node;
	while (temp != nullptr)
	{
		temp = temp->next;
		len++;
	}
	return len;
}

void LinkListUtil::println(Node *node)
{
	Node *temp = node;
	while (temp != nullptr)
	{
		printf("the node data is : %d\n", temp->data);
		temp = temp->next;
	}
}

Node* LinkListUtil::remove(Node *head, int num)
{
	Node *temp = head;
	Node *pre = nullptr;
	//find the node
	while (temp != nullptr)
	{
		if (temp->data != num)
		{
			pre = temp;
			temp = temp->next;
		}
		else
		{
			break;
		}
	}
	if (pre == nullptr)
	{
		head = head->next;
	}
	else {
		pre->next = temp->next;
	}
	delete temp;
	return head;
}

Node* LinkListUtil::insert(Node *head, int num, int index)
{
	int len = getLenght(head);
	if (index >= len)
	{
		printf("The index is greater than the length of link list!\n");
		return head;
	}
	Node *temp = head;
	Node *pre = nullptr;
	//if index is -1 then insert the num into the link list end.
	int tempIndex = 0;
	if (index <= -1)
		index = len;
	//find the insert point.
	while (temp != nullptr && index != tempIndex)
	{
		tempIndex++;
		pre = temp;
		temp = temp->next;
	}
	//insert the num.
	Node *nd;
	nd = new Node();
	nd->data = num;
	if (pre == nullptr)
	{
		nd->next = head;
		delete pre, temp;
		return nd;
	}
	else {
		nd->next = temp;
		pre->next = nd;
		return head;
	}
}

Node* LinkListUtil::sort(Node *head)
{
	//if only has one element or none elements
	if (head == nullptr || head->next == nullptr)
		return head;

	Node *p0, *p1;
	int temp = 0;
	p0 = head;
	//bubble sort
	while (p0 != nullptr && p0->next != nullptr)
	{
		p1 = p0->next;
		while (p1 != nullptr)
		{
			if (p0->data > p1->data)
			{
				temp = p0->data;
				p0->data = p1->data;
				p1->data = temp;
			}
			p1 = p1->next;
		}
		p0 = p0->next;
	}
	return head;
}

Node* LinkListUtil::reserve(Node *head)
{
	//if only has one element or none elements
	if (head == nullptr || head->next == nullptr)
		return head;

	Node *p0, *p1, *p2;
	p0 = head;
	p1 = p0->next;
	while (p1 != nullptr)
	{
		p2 = p1->next;
		p1->next = p0;
		p0 = p1;
		p1 = p2;
	}
	head->next = nullptr;
	return p0;
}

Node* LinkListUtil::removeHead(Node *head)
{
	//if only has one element or none elements
	if (head == nullptr || head->next == nullptr)
		return head;
	Node *p0;
	p0 = head->next;
	head->next = p0->next;
	head = p0;
	return head;
}

最后是main测试:

// Win32Project2.cpp
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <assert.h>

#include "LinkListUtil.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//////////////////////////////////////////////////////////////////////////

	int arr[5] {3, 1, 9, 4, 6};

	auto linkList = new LinkListUtil();
	auto head = linkList->createByArray(arr, 5);
	//Get linkList size;
	auto len = linkList->getLenght(head);
	printf("LinkList's length:%d\n", len);

	printf("Print LinkList:\n");
	linkList->println(head);

	printf("Remove element 1 and print LinkList:\n");
	head = linkList->remove(head, 1);
	linkList->println(head);

	printf("Insert element 5 into the index 1 and print LinkList:\n");
	head = linkList->insert(head, 5, 1);
	linkList->println(head);

	printf("Insert element 2 into the end and print LinkList:\n");
	head = linkList->insert(head, 2);
	linkList->println(head);

	printf("Bubble sort:\n");
	head = linkList->sort(head);
	linkList->println(head);

	printf("reserve:\n");
	head = linkList->reserve(head);
	linkList->println(head);

	printf("remove head:\n");
	head = linkList->removeHead(head);
	linkList->println(head);
	//clear
	delete linkList;
	//////////////////////////////////////////////////////////////////////////
	system("pause");
	return 0;
}
时间: 2024-11-05 02:55:44

C++ 实现链表常用功能的相关文章

js常用功能代码

js常用功能代码(持续更新): 1,--折叠与展开 <input id="btnDisplay" type="button" class="baocun2" value="添加" onclick="changeDisplay()" /> <script type="text/javascript"> function changeDisplay() { var h

SVN的安装与常用功能使用以及解决安装配置过程中的一些错误

SVN简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,将工程代码集中在服务器上进行一个统一的集中式管理,从而能够方便地控制代码版本,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的,而且通过使用SVN开发人员之间[学Java,到凯哥学堂kaige123.com]能够很方便的更新.提交工程代码,并且如果工程的版本有冲突还

WebStorm常用功能的使用技巧分享

WebStorm 是 JetBrain 公司开发的一款 JavaScript IDE,使用非常方便,可以使编写代码过程更加流畅. 本文在这里分享一些常用功能的使用技巧,希望能帮助大家更好的使用这款强大的 JavaScript 开发工具. 代码编辑 代码跳转: Ctrl + 左键 或者 Ctrl + B,可以跳转到函数或者变量的声明位置 调用位置: Alt + F7,查找调用者 自动补全: 最好是修改一下响应时间,Settings->Editors->General->Code Compl

项目中常用功能,如:流媒体、健康数据(步数等)等-b

整理iOS开发中使用的各种流媒体和常用的高级功能.由于时间关系,目前只写了一部分功能,全部都采用的是系统方法,没用第三方,截图如下: screen1.png screen2.png 个人比较懒,不爱多写文字,直接上代码,哈哈. 视频 系统用AVFoundation与MediaPlayer框架实现播放视频的方案.其中AVFoundation扩展性好,都需自定义功能,而MediaPlayer集成简单,但是样式不可扩展. 1.AVFoundation使用AVPlayer播放视频,它属于view的lay

html(三) -- 常用功能标签

媒体标签 <embed></embed> 属性:        hidden : 设置隐藏插件是否隐藏.        src :用于指定音乐的路径 超链接标签 <a></a> 属性: href  : 用于指定链接的资源.常用协议:file:. mailTo:. http:      target: 设置打开新资源的目标.属性对应的值:_Blank 在独立的窗口上打开新资源   _self 在当前窗口打开新资源. a标签的原理:    1. a标签的href

IOS开发-OC学习-常用功能代码片段整理

IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是在做与URL有关的功能时,需要在Info.plist中添加一段代码进而实现让网址完成从Http到Https的转换,以及其他的一些功能. 在从一个新手到逐渐学会各种功能.代码.控件.方法如何使用的过程中,也在逐渐积累一些知识,但是一次总不会把这些东西都深刻记住并完全理解.所以在这儿记录下这些东西,用来

keepalived高可用的常用功能介绍

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.本篇文章会介绍keepalived的安装,配置,还有keepalived的一些脚本,keepalived+nginx高可用实现和keepalived双机互为主从的实现. keep

WebPack常用功能介绍

概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.template等.个人认为它的优点就是易用,而且常用功能基本都有,另外可以通过自己开发loader和plugin来满足自己的需求.这里就尽量详细的来介绍下一些基本功能的使用. 上一篇已经介绍如何安装了,这里就不再重复了. 运行webpack webpack需要编写一个config文件,然后根据这个文件来执行需

[转]WebPack 常用功能介绍

概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.template等.个人认为它的优点就是易用,而且常用功能基本都有,另外可以通过自己开发loader和plugin来满足自己的需求.这里就尽量详细的来介绍下一些基本功能的使用. 安装 npm install webpack 运行webpack webpack需要编写一个config文件,然后根据这个文件来执行需