單向鏈表c++實現

單向鏈表的結構

單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。
在這裏插入圖片描述
設置節點類如下:

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;
}


在這裏插入圖片描述

小結

單鏈表是數據結構與算法的基礎,特記錄自己的學習思路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章