1. 程式人生 > >單鏈表類:class Slist

單鏈表類:class Slist

//單鏈表
//內容:預設4個,增刪6個,列印,查詢

#pragma once

#include<iostream>
#include<assert.h>
using namespace std;

typedef int DataType;	

//節點類,struct類預設公有
struct SListNode
{
	//建構函式和成員變數都是公有的
	SListNode* _next;
	DataType _data;
	//寫了建構函式就不用BuyNode了,可以直接new
	SListNode(DataType x)	//注意L是大寫
		:_data(x)
		,_next(NULL)
	{}
};

//單鏈表類
class Slist
{
	typedef SListNode Node;
public:
	Slist()
		:_head(NULL)
		,_tail(NULL)	//方便尾插
	{}

	Slist(const Slist& s)
		:_head(NULL)
		,_tail(NULL)
	{
		Copy(s);
	}

	~Slist()
	{
		Destory();
	}

	//Slist& operator=(const Slist& s)	//傳統寫法
	//{
	//	if(this != &s)
	//	{
	//		//釋放this,頭尾置空否則為野指標,後面PushBack會出錯
	//		Destory();
	//		//
	//		Copy(s);
	//	}
	//	//自己給自己賦值,直接走這裡,不走if語句
	//	return *this;
	//}

	Slist& operator=(Slist s)	//現代寫法,拷貝構造沒現代寫法,因為沒有帶參的建構函式
	{
		swap(_head, s._head);
		swap(_tail, s._tail);
		return *this;
	}

	void Destory()	//釋放連結串列
	{
		//_head為空不進入while所以這裡無需判定_head不為空
		Node* cur = _head;
		while(cur)
		{
			Node* del = cur;
			cur = cur->_next;
			delete del;
			//Node* next = cur;
			//delete cur;
			//cur = next;
		}
		_head = _tail = NULL;
	}

	void Copy(const Slist& s)
	{
		Node* cur = s._head;
		while(cur)
		{
			PushBack(cur->_data);
			cur = cur->_next;
		}
	}

	void PushBack(DataType x);
	void PushFront(DataType x);
	void Insert(Node* pos, DataType x);
		//1.頭插 2.隨機
	void PopBack();
	void PopFront();
	void Erase(Node* pos);
		//1.頭刪 2.尾刪 3.隨機	
	void Print();
	Node* Find(DataType x);






private:
	//是指向節點的指標SListNode*,不是指向單鏈表類的指標Slist
	SListNode* _head;
	SListNode* _tail;
};

void Slist::PushBack(DataType x)
{
	//1.空 2.非空
	if(_head == NULL)
	{
		_head = _tail = new Node(x);
	}
	else
	{
		_tail->_next = new Node(x);
		_tail = _tail->_next;
	}
}

void Slist::PushFront(DataType x)
{
	//1.空 2.非空
	if(_head == NULL)
	{
		_head = _tail = new Node(x);
	}
	else
	{
		Node* tmp = new Node(x);
		tmp->_next = _head;
		_head = tmp;
	}
}

void Slist::Insert(Node* pos, DataType x)
{
	//因為能指定位置,則至少有一個節點
	//1.頭插 2.隨機位置
	assert(pos);
	if(_head == pos)
	{
		PushFront(x);
	}
	else
	{
		Node* prev = _head;
		while(prev->_next != pos)
		{
			prev = prev->_next;
		}
		Node* tmp = new Node(x);
		prev->_next = tmp;
		tmp->_next = pos;
	}
}

void Slist::PopBack()
{
	//1.空 2.1個 3.多個
	if(_head == NULL)
	{
		return;
	}
	else if(_head == _tail)
	{
		delete _tail;
		_head = _tail = NULL;
	}
	else
	{
		Node* prev = _head;
		while(prev->_next != _tail)
		{
			prev = prev->_next;
		}
		delete _tail;
		_tail = prev;
		_tail->_next = NULL;
	}
}

void Slist::PopFront()
{
	//1.空 2.1個 3.多個
	if(_head == NULL)
	{
		return;
	}
	else if(_head == _tail)
	{
		delete _head;
		_head = _tail = NULL;
	}
	else
	{
		Node* del = _head;
		_head = _head->_next;
		delete del;
	}
}

void Slist::Erase(Node* pos)
{
	//1.尾刪 2.頭刪 3.隨機
	assert(pos);
	if(pos == _tail)
	{
		PopBack();
	}
	else if(pos == _head)
	{
		PopFront();
	}
	else
	{
		Node* prev = _tail;
		while(prev->_next != pos)
		{
			prev = prev->_next;
		}
		prev->_next = pos->_next;
		delete pos;
	}
}

SListNode* Slist::Find(DataType x)	//這裡不能寫Node*因為typedef在類裡面沒在外面
{
	Node* cur = _head;
	while(cur)
	{
		if(cur->_data == x)
		{
			return cur;
		}
		cur = cur->_next;
	}
	return NULL;
}

void Slist::Print()
{
	Node* cur = _head;
	while(cur)
	{
		cout<<cur->_data<<" ";
		cur = cur->_next;
	}
	cout<<endl;
}

相關推薦

單鏈class Slist

//單鏈表 //內容:預設4個,增刪6個,列印,查詢 #pragma once #include<iostream> #include<assert.h> using namespace std; typedef int DataType;

順序class SeqList

//順序表,不是字串沒'\0' //預設4個,增刪6個,查詢,列印,容量檢測 #pragma once #include <iostream> #include <assert.h> using namespace std; typedef i

資料結構實驗2C++實現單鏈

       太簡單了,沒啥可說的,程式碼意義明白如話。        題目與要求:                                                          實驗2      2.1 實驗目的        熟練掌握線

C++實現單鏈

       太簡單了,直接貼題目然後上程式碼。        題目: 實驗2 2.1 實驗目的 熟練掌握線性表的鏈式儲存結構。 熟練掌握單鏈表的有關演算法設計。 根據具體問題的

單鏈的實現

一個普通的單鏈表(一個指標域),對於其最重要的就是單鏈表的頭指標,通過頭指標可以確定單鏈表的一些屬性,如:是不是空的,通過頭指標進行遍歷等。 我們用python做一個單鏈表的類實現,要求可以建立一個空的

單鏈建立頭插法與尾插法

1、採用頭插入法建立單鏈表的思路:首先建立一個空表,生成一個新的節點;並將讀取到的資料放入新節點的資料域中,然後將該節點插入到當前連結串列的表頭,即就是頭結點之後;直到插入元素完成。 2、效果:採用頭

給定單鏈LL0→L1→...→Ln-1→Ln, 重新排序L0→Ln→L1→Ln-1→L2→Ln-2→...

本題源自leetcode  143 ---------------------------------------------------------------------------- 思路1:用快慢指標找到中節點,然後反轉後半部分連結串列。然後倆個連結串列交叉插入 程

pythonclass建立 new init詳解

在Python中,可以通過class關鍵字定義自己的類,然後通過自定義的類物件類建立例項物件。python類的建立建立一個Student的類,並且實現了這個類的初始化函式”__init__”,class Student(object): #object 可省略    coun

jvm探祕五Class檔案結構之屬性

概述 在Class檔案、欄位表和方法表都可以攜帶自己的屬性資訊,這個資訊用屬性表進行描述,用於描述某些場景專有的資訊。 與Class檔案中其它資料項對長度、順序、格式的嚴格要求不同,屬性表集合不要求其中包含的屬性表具有嚴格的順序,並且只要屬性的名稱不與已

C++順序實現約瑟夫問題_密碼不同

class josephus main clu 定義 void seq esp while //.h #pragma once#include <iostream>using namespace std;#define MAXSIZE 100 template

ES6-18class及其繼承

數據 truct 否則 on() 自動 自己 ren ext clas JavaScript作為一個動態語言,很大程度上的詬病就是缺少了面向對象的類這個概念,ES5傳統的方法是通過構造函數來實現類的特性;ES6引入了類這一概念,將Class這個概念作為對象的模板,通過關鍵

【深入Java虛擬機】之二Class文件結構

本質 拒絕 處理 implement align 默認值 改變 占用 至少 平臺無關性 Java是與平臺無關的語言,這得益於Java源代碼編譯後生成的存儲字節碼的文件,即Class文件,以及Java虛擬機的實現。不僅使用Java編譯器可以把Java代碼編譯成存儲字節

python Class面向對象高級編程 元type

soft elf ast 類型 普通 lin 元類 flow 類的方法 type的用法:1、普通的type用法:檢查類型class my(object): def hello(self, name='world'): print(&#

「深入Java虛擬機(2)」Class文件結構

1.5 trac 三種 type 類構造 face 方法 class throw Java是與平臺無關的語言,這得益於Java源代碼編譯後生成的存儲字節碼的文件,即Class文件,以及Java虛擬機的實現。不僅使用Java編譯器可以把Java代碼編譯成存儲字節碼的Class

結構體、聯合體、struct、union、class

                   區別:類的成員預設是私有的private                 &n

資料結構 筆記單鏈的具體實現

LinkList設計要點 -類模板,通過頭結點訪問後繼結點 -定義內部結點型別Node,用於描述資料域和指標域 -實現線性表的關鍵操作(增,刪,查,等) template<typename T> class LinkList : public List<T>

資料結構 筆記靜態單鏈的實現

單鏈表的一個缺陷 -觸發條件 ·長時間使用單鏈表物件頻繁增加和刪除資料元素 -可能的結果 ·堆空間產生大量的記憶體碎片,導致系統執行緩慢 新的線性表 設計思路: 在單鏈表的內部增加一片預留的空間,所有Node物件都在這片空間中動態建立和動態銷燬。 靜態單鏈表的實

資料結構 筆記單鏈的遍歷與優化

如何遍歷單鏈表中的每一個數據元素? 為單鏈表提供新的方法,線上性時間內完成遍歷 設計思路(遊標) -在單鏈表的內部定義一個遊標(Node* m_current) -遍歷開始前將遊標指向位置為0的資料元素 -獲取遊標指向的資料元素 -通過結點中的next指標移動遊標 提供一

資料結構 筆記順序單鏈的對比分析

如何判斷某個資料元素是否存在於線性表中? find -可以為線性表(List)增加一個查詢操作 -int find(const T& e)const; ·引數: ~待查詢的資料元素 ·返回值: ~>= 0:資料元素線上性表中第一次出現的位置 ~-1:資料

19.執行緒同步訊號量—>[單生產者/單消費者]單鏈的插入和刪除

1.訊號量 1.訊號量本質 訊號量是鎖,是一種升級的mutex 訊號量在初始化時,可以指定共享資源的數量 2.相關函式 #include<semaphore.h> //標頭檔案 sem_t sem; //訊號量型別 int sem_destroy(se