1. 程式人生 > >C++實現單向連結串列(1)

C++實現單向連結串列(1)

需要在你的主程式中新增

#include "ListNode.cpp"

ListNode.h

#pragma once
#include <iostream>
using namespace std;


template <typename T>
class ListNode
{
private:
	T data;
	ListNode<T>* link;

public:
	ListNode(T theData, ListNode<T>* theLink)
	{
		data = theData;
		link = theLink;
	}

	void setLink(ListNode<T>* theLink) { link = theLink; }

	T getData() { return data; }
	ListNode<T>* getLink() { return link; }
};


//獲取連結串列的長度
template <typename T>
int Length(ListNode<T>* theHead);


//按標號查詢節點
template <typename T>
ListNode<T>* LookNode(ListNode<T>* theHead, int pos);


//在任意位置新增節點
template <typename T>
void AddNode(ListNode<T>*& theHead, int pos, T theData);


//刪除任意位置的節點
template <typename T>
void DelNode(ListNode<T>*& theHead, int pos);


//清空連結串列
template <typename T>
void EmptyList(ListNode<T>*& theHead);

ListNode.cpp

#include "ListNode.h"


//-----獲取連結串列的長度-----------------------------------//
template <typename T>
int Length(ListNode<T>* theHead)
{
	if (theHead == nullptr)
	{
		//頭指標為空的話返回0
		return 0;
	}
	else
	{
		int count = 0;
		ListNode<T>* theNode = theHead;
		while (theNode != nullptr)
		{
			count++;
			theNode = theNode->getLink(); 
		}
		return count;  //返回節點個數
	}
}


//-----按標號查詢節點-----------------------------------//
template <typename T>
ListNode<T>* LookNode(ListNode<T>* theHead, int pos)
{
	if (theHead == nullptr)
	{
		cout << "輸入錯誤,頭指標不能為空!" << endl;
		return nullptr;
	}
	else
	{
		if (pos == 0)  //查詢頭節點
		{
			return theHead;
		}
		else if (pos > 0)  //非頭節點的情況
		{
			if (pos < Length(theHead))  //標號不能超出連結串列實際長度
			{
				ListNode<T>* theNode = theHead;
				for (int i = 0; i < pos; i++)
				{
					theNode = theNode->getLink();
				}
				return theNode;
			}
			else
			{
				cout << "輸入錯誤,標號超出連結串列實際長度!" << endl;
				return nullptr;
			}
		}
		else
		{
			cout << "輸入錯誤,標號不能為負數!" << endl;
			return nullptr;
		}
	}
}


//-----在任意位置新增節點-------------------------------//
template <typename T>
void AddNode(ListNode<T>*& theHead, int pos, T theData)
{
	if (theHead == nullptr)  //連結串列為空的情況
	{
		if (pos == 0)
		{
			theHead = new ListNode<T>(theData, nullptr);
		}
		else if (pos > 0)
		{
			cout << "輸入錯誤,標號超出連結串列實際長度!" << endl;
		}
		else
		{
			cout << "輸入錯誤,標號不能為負數!" << endl;
		}
	}
	else  //連結串列不為空的情況
	{
		if (pos == 0)  //在連結串列頭部插入節點
		{
			theHead = new ListNode<T>(theData, theHead);
		}
		else if (pos > 0)
		{
			if (pos < Length(theHead))  //在連結串列中間插入節點
			{
				//找到插入點的前一個節點
				ListNode<T>* theNode = LookNode(theHead, pos - 1);
				theNode->setLink(new ListNode<T>(theData, theNode->getLink()));
			}
			else if (pos == Length(theHead))  //在連結串列尾部插入節點
			{
				//找到尾部節點
				ListNode<T>* theNode = LookNode(theHead, pos - 1);
				theNode->setLink(new ListNode<T>(theData, nullptr));
			}
			else
			{
				cout << "輸入錯誤,標號超出連結串列實際長度!" << endl;
			}
		}
		else
		{
			cout << "輸入錯誤,標號不能為負數!" << endl;
		}
	}
}


//-----刪除任意位置的節點-------------------------------//
template <typename T>
void DelNode(ListNode<T>*& theHead, int pos)
{
	if (theHead == nullptr)
	{
		cout << "輸入錯誤,頭指標不能為空!" << endl;
	}
	else  //連結串列不為空的情況
	{
		if (pos == 0)  //刪除頭部節點的情況
		{
			if (Length(theHead) == 1)  //若連結串列只有一個節點
			{
				delete theHead;
				theHead = nullptr;
			}
			else  //連結串列有多個節點的情況
			{
				ListNode<T>* theNode = theHead;
				theHead = theHead->getLink();
				delete theNode;
			}
		}
		else if (pos > 0)
		{
			if (pos < Length(theHead) - 1)  //刪除中間節點的情況
			{
				//找到要刪除的節點
				ListNode<T>* theCurrent = LookNode(theHead, pos);
				//找到要刪除的節點的前一個節點
				ListNode<T>* thePrev = LookNode(theHead, pos - 1);
				thePrev->setLink(theCurrent->getLink());
				delete theCurrent;
			}
			else if (pos == Length(theHead) - 1)  //刪除尾部節點的情況
			{
				//找到尾部節點
				ListNode<T>* theLast = LookNode(theHead, pos);
				//找到尾部節點的前一個節點
				ListNode<T>* thePrev = LookNode(theHead, pos - 1);
				thePrev->setLink(nullptr);
				delete theLast;
			}
			else
			{
				cout << "輸入錯誤,標號超出連結串列實際長度!" << endl;
			}
		}
		else
		{
			cout << "輸入錯誤,標號不能為負數!" << endl;
		}
	}
}


//-----清空連結串列-----------------------------------------//
template <typename T>
void EmptyList(ListNode<T>*& theHead)
{
	int length = Length(theHead);
	for (int i = 0; i < length; i++)
	{
		DelNode(theHead, 0);
	}
}

相關推薦

C++實現單向連結串列(1)

需要在你的主程式中新增#include "ListNode.cpp"ListNode.h#pragma once #include <iostream> using namespace std; template <typename T> clas

C++ 實現單向連結串列

#include<iostream> #include<string> #include<stack> using namespace std; struct Node {int value;Node* Next; }; class List { private:

c++實現單向連結串列和雙向連結串列

連結串列是一種非常基礎的資料結構,本身也比較靈活,突破了陣列在一開始就要確定長度的限制,能夠做到隨時使用隨時分配記憶體。同時還有新增,刪除,查詢等功能。 總的來說,連結串列是由幾個模組構成的。 一,單向連結串列 //連結串列基本元素 struct Nod

c實現功能(13)實現單向連結串列的簡要功能

#include <stdio.h> #include <stdlib.h> //利用結構體建立節點 struct list{ //建立資料域 int data; //建立指標域 struct list *next; }; //實現建立一個

C語言版)連結串列(一)——實現單向連結串列建立、插入、刪除等簡單操作(包含個人理解說明及註釋,新手跟著寫程式碼)

我學習了幾天資料結構,今天下午自己寫了一個單向連結串列的程式。我也是新手,所以剛開始學習資料結構的菜鳥們(有大牛們能屈尊看一看,也是我的榮幸)可以和我一起共同學習、討論,當然也很高興能指出我的錯誤,因為這是我們一起成長的過程。本程式碼包含我在寫程式時的一些個人理解的說

Linux C 單向連結串列1

線性表儲存結構分為順序儲存、鏈式儲存。        順序儲存的優點:        順序儲存的缺點:      &n

C++版)連結串列(一)——實現單向連結串列建立、插入、刪除等相關操作

         前段時間用C語言實現了連結串列的相關操作,但是發現當時挺清楚的,過了一段時間又忘的差不多了,所以現在打算用C++再實現一遍,由於初次用C++實現,存在錯誤的地方還望大家指標。下面就直接上程式碼: #include <iostream> #in

C++之單向連結串列

定義: struct ListNode{ int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} } 1.定義新的單向連結串列 ListNode *dummy = new ListNode(

C語言 單向連結串列

1、單向連結串列的定義 struct student { char name[10]; float score; struct student *next; }; next作為同類型指標,指向與它所在節點一樣的節點。 2、單向連結串列的基本操作 1)建立連結

讓新手更能理解的c語言單向連結串列

此文是專門詳解單項鍊表有些同學想不懂的問題。 一列火車,火車有許多的車廂,每節車廂之間有一根鏈子相連,只有通過鏈子才能連線到下一節車廂,如果鏈子斷掉了,那麼後面的車廂就找不到了。連結串列可以說就是這樣的原理。以下是我寫的較為簡單一個單向連結串列:為了錄入40名同學的名字和學

C語言單向連結串列基本操作

資料結構練習 “` typedef struct node{ int data; struct node * next; } Node; void Create(Node**); void Output(Node*); No

使用Java實現單向連結串列,並完成連結串列反轉。

使用Java實現單向連結串列,並完成連結串列反轉。 演算法和資料結構是程式設計師逃不過的一個坎,所以趁著閒餘時間,開始學習基礎的演算法和資料結構。這裡記錄下自己實現簡單的單項鍊表的過程,如有錯誤,敬請指正。 明確需求 在Java中,常用的資料容器裡面,跟連結串列關係緊密的當屬

C++中單向連結串列相關知識

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 其中,  ListNode(int x) : val(x), nex

使用JavaScript實現單向連結串列

一、實現功能   1、連結串列元素頭部插入 this.unShift = function(data) {}   2、連結串列元素尾部插入 this.append= function(data) {} //返回boolean   3、連結串列元素按位置插入 this.insert= funct

C++實現雙向連結串列的建立,插入,修改,刪除

#include<iostream> #include<string> using namespace std; struct Node {int value;Node* pre;Node* next; }; class Double_list { private:Node*

java實現--單向連結串列的插入和刪除

一、連結串列結構: (物理儲存結構上不連續,邏輯上連續;大小不固定)           概念:  鏈式儲存結構是基於指標實現的。我們把一個數據元素和一個指標稱為結點。        資料域:存數資料元素資訊的域。        指標域:儲存直接後繼位置的域。鏈式儲存結構是用

java實現單向連結串列CRUD,反轉,排序,查詢倒數第k個元素,遞迴輸出等操作

package myLink; import javax.xml.transform.Templates; public class LianBiao { static Node head=null; /** * 查詢單鏈表的中間節

c++實現雙向連結串列,類模板雙向連結串列

#include<iostream> #include<assert.h> using namespace std; typedef int Datatype; typedef struct Node//連結串列是由一個個節點組成所以這裡單獨定義這一型別方便在連結串列類中使用 {  

利用頭插法實現單向連結串列的逆置

        這篇文章將再次討論單向連結串列的逆置問題。在原來的那篇文章中,我用了三個指標實現了這一功能,這樣顯得非常的麻煩複雜,程式碼也寫的略長一些。但是最近一同學給我看她寫的程式碼,利用建立單向連結串列時的頭插法,只需兩個指標就輕鬆巧妙的實現了單向連結串列的逆置過程。

C++建立單向連結串列連結串列頭指標需要使用指標型別的引用引數?

{int date; Node *next;}; void CreateList(Node *&head) //引用引數是表頭指標 { s=new Node; cin>>s->data; while(s->data!=0) {if(head==NULL)head=s; e