1. 程式人生 > >c++實現單鏈表基本操作

c++實現單鏈表基本操作

程式媛決定好好學習寫程式碼

連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。相比於線性表順序結構,操作複雜。由於不必須按順序儲存,連結串列在插入的時候可以達到O(1)的複雜度,比另一種線性表順序錶快得多,但是查詢一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間複雜度分別是O(logn)和O(1)。

使用連結串列結構可以克服陣列連結串列需要預先知道資料大小的缺點,連結串列結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理

。但是連結串列失去了陣列隨機讀取的優點,同時連結串列由於增加了結點的指標域,空間開銷比較大。連結串列最明顯的好處就是,常規陣列排列關聯專案的方式可能不同於這些資料專案在記憶體或磁碟上順序,資料的存取往往要在不同的排列順序中轉換。連結串列允許插入和移除表上任意位置上的節點,但是不允許隨機存取。連結串列有很多種不同的型別:單向連結串列,雙向連結串列以及迴圈連結串列。連結串列可以在多種程式語言中實現。像Lisp和Scheme這樣的語言的內建資料型別中就包含了連結串列的存取和操作。程式語言或面嚮物件語言,如C,C++和Java依靠易變工具來生成連結串列。

其中儲存資料元素資訊的域稱作資料域(設域名為data),儲存直接後繼儲存位置的域稱為指標域

(設域名為next)。指標域中儲存的資訊又稱做指標或鏈。

由分別表示,,…,的N 個結點依次相鏈構成的連結串列,稱為線性表的鏈式儲存表示,由於此類連結串列的每個結點中只包含一個指標域,故又稱單鏈表或線性連結串列。


linkedlist.h  //標頭檔案,定義節點和連結串列資訊及宣告建立、插入、刪除等基本函式

/*連結串列的實現,實現建立、插入、刪除等操作*/
#include <string>
using namespace std;

struct StuInfo
{
	int id;  //學號
	string name;   //姓名
};

struct Node
{
	StuInfo info;
	Node *next;
	Node(){}
	Node(StuInfo x){ info = x; next = NULL; }
};

class LinkedList
{
public:
	LinkedList(); //建構函式
	~LinkedList(); //解構函式
	void insert(StuInfo info, int pos);
	void remove(int id);  //根據學生學號進行刪除
	int find(int id); //根據學號進行查詢,返回節點位置
	int getLength(); //獲得連結串列長度
	void print();  //列印連結串列資訊
private:
	Node *head;
	int length;

};

下面繼續編寫對應的原始檔,linkedlist.cpp  //實現具體函式內容
#include <iostream>
#include "linkedlist.h"
using namespace std;

//建構函式
LinkedList::LinkedList()
{
	head = NULL;
	length = 0;
}

//解構函式
LinkedList::~LinkedList()
{
	Node* temp;
	for (int i = 0; i < length; i++)
	{
		temp = head;
		head = head->next;
		delete temp;
	}

}

void LinkedList::insert(StuInfo info, int pos)
{
	if (pos < 0)
	{
		cout << "節點位置必須是正整數" << endl;
	}
	int index = 1;
	Node *temp = head;
	Node *node = new Node(info);
	if (pos == 0)
	{
		node->next = temp;
		head = node;
		length++;
		return;
	}
	while (index < pos && temp != NULL)
	{
		temp = temp->next;
		index++;
	}
	if (temp == NULL)
	{
		cout << "插入失敗,位置序號超過連結串列長度" << endl;
		return;
	}
	node->next = temp->next;
	temp->next = node;
	length++;
	return;
}

void LinkedList::remove(int id)
{
	int pos = find(id);
	if (pos == -1)
	{
		cout << "連結串列中沒有該學號,無法刪除對應資訊" << endl;
		return;
	}
	if (pos == 0)
	{
		head = head->next;
		length--;
		return;
	}
	int index = 1;
	Node *temp = head;
	while (index < pos)
	{
		temp = temp->next;
	}
	temp->next = temp->next->next;
	length--;
	return;
}

int LinkedList::find(int id)
{
	Node *temp = head;
	int index = 0;
	while (temp != NULL)
	{
		if (temp->info.id == id)
		{
			return index;
		}
		temp = temp->next;
		index++;
	}
	return -1;
}

int LinkedList::getLength()
{
	return length;
}

void LinkedList::print()
{
	if (head == NULL)
	{
		cout << "連結串列為空,沒有資訊" << endl;
		return;
	}
	Node *temp = head;
	while (temp != NULL)
	{
		cout << temp->info.id << "," << temp->info.name << endl;
		temp = temp->next;
	}
	cout << endl;
	return;
}

最後,編寫測試用的main函式
#include <iostream>
#include <string>
#include "linkedlist.h"
using namespace std;
int main()
{
	LinkedList head;
	StuInfo info1, info2, info3, info4, info5;
	info1.id = 1001, info1.name = "張三", info2.id = 1002, info2.name = "莉絲", info3.id = 1003, info3.name = "李武", info4.id = 1004, info4.name = "六南", info5.id = 1005, info5.name = "琪琪";

	//測試插入資料
	cout << "測試插入:" << endl;
	head.insert(info1, 0);
	head.print();
	head.insert(info2, 1);
	head.print();
	head.insert(info3, 4);
	head.print();
	head.insert(info4, 0);
	head.print();
	head.insert(info5, 2);
	head.print();
	//測試刪除資料
	cout << "測試刪除:" << endl;
	cout << "連結串列長度為:" << head.getLength() << endl;
	head.remove(1004);
	head.print();
	cout << "連結串列長度為:" << head.getLength() << endl;
	head.remove(1004);
	head.print();
	return 0;
}

相關推薦

c++實現單鏈基本操作

程式媛決定好好學習寫程式碼 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,

c++學習筆記—單鏈基本操作實現

用c++語言實現的單鏈表基本操作,包括單鏈表的建立(包括頭插法和尾插法建表)、結點的查詢、刪除、排序、列印輸出、逆置、連結串列銷燬等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include <malloc.h

C++ 單鏈表基本操作分析與實現 連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結

連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表

C++實現單鏈的12種基本操作

C++單鏈表的操作 2017-12-25 // 單鏈表.cpp: 定義控制檯應用程式的入口點。 //Author:kgvito //Date: 2017.12.25 #include "stdafx.h" #include<iostream> usin

單鏈基本操作C語言實現(鏈式儲存結構)

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }

《資料結構與演算法》-單鏈基本操作C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

C語言實現線性基本操作

style eal struct fine fin delete class logs destroy #include <stdio.h> #include <tchar.h> #include <stdlib.h> #define

C 資料結構中單鏈基本操作

C中的typedef C中的typedef關鍵字作用是為一種資料型別定義一個新名字,這樣做的目的有兩個,一是給變數定義一個易記且意義明確的新名字,如: typedef unsigned char BYTE; 把unsigned char型別自命名為BYTE。另一個目的是

單鏈基本操作java實現

單鏈表基本操作 - java實現 1.單鏈表學習了好久,今天終於有時間寫一下了,帶頭結點的單鏈表上的基本操作,Java實現。 (1) 先來個介面 public interface IList { public void clear(); //清空連結串列 publi

資料結構(c語言)——線性單鏈基本操作

#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"

c++實現單鏈的各種操作

在下例中,演示了單鏈表的各種操作 #include <iostream> using namespace std; typedef struct Node { int data; //資料域 struct Node * next; //指標域

單鏈 基本操作(元素遞增排序)

題目描述: 有一個帶頭節點的單鏈表L(至少有一個數據節點),設計一個演算法使其元素遞增有序排列。 解題思路: 由於單鏈表L中有一個以上的資料節點,首先構造一個只含有頭結點和首節點的有序單鏈表(只含有一個數據節點的單鏈表一定是有序的),然後掃描單鏈表L餘下的節點(由P指向),在有序單鏈表中

單鏈基本操作(刪除連結串列中最大元素)

題目描述: 設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一) 解題思路: 在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連

單鏈 簡單題(單鏈基本操作

題目描述: 有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,......an,bn),設計一個演算法將其拆分成兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的頭結點。 解題思路: 利用原單鏈表L中的所有

C++實現單鏈

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

用Python實現單鏈操作

直接看程式碼: class Node(object): def __init__(self,elem): self.elem=elem self.next=None class SingleLinkList(object):

【資料結構】單鏈-----基本操作

刪除指定位置的節點 void Erase(pList * pplist, pNode pos) { assert(pplist != NULL); assert(pos != NULL); if (*pplist == pos)//如果指向第一個節點

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

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

C++實現單鏈的逆轉

答: 方法一:把連結串列中各結點的next域指向其前驅結點,並將原先第一個結點的next域設為NULL,將head指向原先連結串列的最後一個結點,其具體實現如下: LinkNode* ReverseLink(LinkNode **head) {LinkNode *cur,*

C++實現棧的基本操作

#include<iostream> #include<cstdlib> #include<malloc.h> #include<stdio.h> using namespace std; #define TRUE 1 #def