单向链表c++实现

被刻印的时光 ゝ 提交于 2020-03-07 22:07:01

单向链表的结构

单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
在这里插入图片描述
设置节点类如下:

class Node{
	int item;
	Node* next;
};

其中节点指针next指向节点类型变量,从而实现链表的连接
设置链表类如下,包含一节点指针head

class SingleLink{
public:
	SingleLink();
	~SingleLink();
	Node* head;
	void append(int);
};

新建一个链表,初始化如下:

SingleLink::SingleLink(){
	head = new Node();
	head->item = 0;
	head->next = NULL;
}

在head = new Node()时,指针head便有了个新的对象
在这里插入图片描述

详解链表尾插法实现原理

1.插入第一个元素,指针n有个新对象

Node* n = new Node();
	n->item = 11;
	n->next = NULL;

在这里插入图片描述
指针next等于指针n,表示next的指向与n的指向一致

head->next = n;
n->next = NULL;

在这里插入图片描述
2.插入第二个元素,即n又有了个新对象

	Node* n = new Node();
	n->item =22;
	n->next = NULL;

在这里插入图片描述
令临时指针temp指向head的指向,循环后,temp的指向指向链表0号位中next的指向,过程图如下:

temp = head;
while(temp->next!=NULL){
temp =temp->next;

在这里插入图片描述
在这里插入图片描述

temp->next = n;

完成第二个节点的尾插
在这里插入图片描述
以此类推,插第n个时,temp指针要指n下,所以链表中append指令时间复杂度为O(n)

具体代码

实现单向链表基本操作代码如下,包含删除,插入,遍历等功能

// 单链表测试.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class Node{
public:
	Node();
	~Node();
public:
	int item;
	Node* next;
};
Node::Node()
{

}
Node::~Node()
{

}
class SingleLink{
public:
	SingleLink();
	~SingleLink();
	Node* head;
	bool is_Linkempty();
	void append(int);
	void travel();
	int get_length();
	void add(int);
	void insert(int pos,int item);
	int search(int item);
	void delete_last();
	void delete_first();
	void deleta_pos(int pos);
	void remove(int item);
};
SingleLink::SingleLink(){
	head = new Node();
	head->item = 0;
	head->next = NULL;
}
SingleLink::~SingleLink(){

}
bool SingleLink::is_Linkempty(){
	return head->next == NULL;
}
void SingleLink::append(int item){
	Node* n = new Node();
	Node* temp;
	n->item = item;
	n->next = NULL;
	if (head->next == NULL)
	{
		head->next = n;
		n->next = NULL;
		return;
	}
	//容易错啊
	//temp = head->next;
	//while(temp!=NULL){
	//	temp = temp->next;
	//}
	//temp->next= n;
	temp = head;
	while(temp->next!=NULL){
		temp =temp->next;
	}
	//只有这样才能改变这个节点的指针域的值啊
	temp->next = n;
}
int SingleLink::get_length(){
	int size = 0;
	//数数用的游标
	Node*cur = head;
	while(cur->next!=NULL){
		size++;
		cur=cur->next;
	}
	return size;

}
void SingleLink::travel(){
	//游标
	Node*cur = head->next;
	while(cur!=NULL){
		cout<<cur->item<<"->";
		cur = cur->next;
	}
	cout<<"Null"<<endl;
}
void SingleLink::add(int item){
	Node* n = new Node;
	n->item = item;
	n->next = head->next;
	head->next = n;
}
void SingleLink::insert(int pos,int item){
  //pos是0到length-1
	if (pos<=0)
	{
		add(item);
		return;
	}
	if (pos>=(this->get_length()))
	{
		append(item);
		return;
	}
	Node* cur1 = head;
	Node* cur2 = head;
	for (int j =0;j<=pos-1;j++)
	{
		cur1 = cur1->next;
		cur2 = cur2->next;
	}
	cur2 = cur2->next;
	Node* n = new Node();
	n->item = item;
	n->next = cur2;
	cur1->next = n;
}
int SingleLink::search(int item){
	//搜索链表中第一个出现该数字的下标
	int pos = 0;
	Node* cur = head;
	while(cur->next!=NULL){
		cur = cur->next;		
		if(cur->item ==item)
		{
			return pos;			
		}
		pos++;
	}
	cout<<"没有该数据"<<endl;
	return -1;	
}
void SingleLink::delete_last(){
	if (get_length()<=0)
	{
		return;
	}
	if (get_length()==1)
	{
		head->next = NULL;
		return;
	}
	/*if(get_length()-2>=0)*/
	Node* cur1 = head;
	for(int i = 0;i<=get_length()-2;i++){
		cur1 = cur1->next;
	}
	//Node* cur2 = cur1->next;
	//free(cur2);
	cur1->next = NULL;
	
}
void SingleLink::delete_first(){
	if (get_length()<=0)
	{
		return;
	}
	if (get_length()==1)
	{
		head->next = NULL;
		return;
	}
	Node* cur1 = head->next;	
	head->next = cur1->next;
}
void SingleLink::deleta_pos(int pos){
	if (pos>=get_length()-1)
	{
		delete_last();
		return;
	}
	if (pos<=0)
	{
		delete_first();
		return;
	}
	Node* cur = head;
	for(int j=0;j<pos;j++)
	{
		cur = cur->next;
	}
	//循环后是3个节点中最前的节点
	Node*cur1 = cur->next;	
	cur->next = cur1->next;
}
void SingleLink::remove(int item){
	//删除第一次出现的元素
	if (search(item)==-1)
	{
		return;
	}
	deleta_pos(search(item));
}
int main()
{
	cout<<"hello world"<<endl;
	SingleLink* L = new SingleLink();
	L->add(2);
	L->append(1);
	L->append(2);
	L->append(5);
	L->travel();
	cout<< L->get_length()<<endl;
	L->add(70);
	L->travel();
	L->insert(1,100);
	L->travel();
	cout<< L->search(70)<<endl;
	cout<< L->get_length()<<endl;
	
	L->remove(12);
	L->remove(2);
	L->travel();
	system("pause");
	return 0;
}


在这里插入图片描述

小结

单链表是数据结构与算法的基础,特记录自己的学习思路

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!