国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

單鏈表的基本操作實(shí)現(xiàn)

1.頭文件

??頭文件和源文件分開有很多好處:可以提高編譯速度、提高代碼的可維護(hù)性、提高代碼的可重用性和可擴(kuò)展性,同時(shí)也可以使代碼結(jié)構(gòu)更清晰,方便代碼的管理和維護(hù)。

LinkList.h

#pragma once

#include<assert.h>

//定義單鏈表節(jié)點(diǎn)
typedef struct LNode
{
	int data;
	LNode* next;

}LNode;

test.cpp

#include<iostream>
using namespace std;

#include"LinkList.h"

?????????????

2.類定義和多種算法的實(shí)現(xiàn)

??(下面所有函數(shù)都默認(rèn)在類中實(shí)現(xiàn))

??我們以帶頭單向非循環(huán)鏈表為例:

??帶頭單向非循環(huán)鏈表是一種鏈表數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)據(jù)域和一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針域。在這種鏈表中,有一個(gè)特殊的節(jié)點(diǎn)稱為頭節(jié)點(diǎn),它指向鏈表的第一個(gè)節(jié)點(diǎn)。頭節(jié)點(diǎn)不是鏈表的一部分,僅用于方便操作。

數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

?????????????

2.1創(chuàng)建空表

??我們定義了一個(gè)名為L(zhǎng)inkList的類,代表一個(gè)單鏈表。這個(gè)類有兩個(gè)私有成員:一個(gè)指向LNode類型的指針_head,代表鏈表的頭節(jié)點(diǎn),以及一個(gè)整型變量_size,代表鏈表的大小。

//定義單鏈表類
class LinkList
{
public:
	//默認(rèn)構(gòu)造函數(shù)
	LinkList()
	{
		_head = new LNode(0);//創(chuàng)建頭結(jié)點(diǎn)(哨兵位節(jié)點(diǎn))
		_size = 0;
	}
	
private:
	LNode* _head;
	int _size;
};

?????????????

2.2頭插法創(chuàng)建n個(gè)元素的線性鏈表

??先以頭插單個(gè)元素為例:

??我們可以先創(chuàng)建一個(gè)新的節(jié)點(diǎn)來(lái)存儲(chǔ)該元素。然后,檢查鏈表是否為空,如果為空,則新節(jié)點(diǎn)就是鏈表的第一個(gè)節(jié)點(diǎn); 否則,新節(jié)點(diǎn)將插入到當(dāng)前頭節(jié)點(diǎn)的后面。插入完成后,_size(代表鏈表元素個(gè)數(shù)的變量)加1。

void push_front(const int& val)
{
	//創(chuàng)建一個(gè)插入的新節(jié)點(diǎn),將要插入的值val賦值給它
	LNode* newnode = new LNode(val);
	LNode* cur = _head->next;//保存原來(lái)第一個(gè)結(jié)點(diǎn)

	//進(jìn)行頭插操作
	_head->next = newnode;
	_head->next->next = cur;//連接原來(lái)的第一個(gè)節(jié)點(diǎn)

	_size++;
}

??加上n循環(huán)即可實(shí)現(xiàn)頭插法創(chuàng)建n個(gè)元素的線性鏈表

//頭插法創(chuàng)建n個(gè)元素
void push_front_n()
{
	cout << "請(qǐng)輸入要插入的元素個(gè)數(shù):";
	int n;
	cin >> n;
	cout << endl;
	cout << "輸入要插入的元素:";
	while (n)
	{
		int tmp;
		cin >> tmp;
		push_front(tmp);
		n--;
	}
}

?????????????

2.3一個(gè)帶頭節(jié)點(diǎn)的鏈表存放一組整數(shù),設(shè)計(jì)一個(gè)算法刪除值等于x的所有節(jié)點(diǎn)。

??無(wú)返回值版本

??我們先檢查鏈表是否為空,如果為空,則輸出一條錯(cuò)誤消息并返回。如果鏈表非空,它開始遍歷鏈表,檢查每個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)是否為要?jiǎng)h除的節(jié)點(diǎn)。如果是,則刪除該節(jié)點(diǎn)并釋放其內(nèi)存;如果不是,則移動(dòng)到下一個(gè)節(jié)點(diǎn)。 在遍歷過程中,保持對(duì)當(dāng)前節(jié)點(diǎn)的引用,以防止刪除連續(xù)的要?jiǎng)h除的節(jié)點(diǎn)時(shí)出現(xiàn)問題。

	//刪除所有x的節(jié)點(diǎn)
void erase_all_x(int x)
{
	LNode* cur = _head;
	if (cur->next == nullptr)//判斷是否為空鏈表
	{
		cout << "該鏈表為空不可刪除\n";
		return;
	}
	else
	{
		while (cur && cur->next)//刪除的數(shù)據(jù)有可能連續(xù),所以最好保持當(dāng)前節(jié)點(diǎn)
		{
			if (cur->next->data == x)//如果下一個(gè)節(jié)點(diǎn)為要?jiǎng)h除節(jié)點(diǎn)
			{
				LNode* tmp = cur->next;//用臨時(shí)指針保存要?jiǎng)h除的節(jié)點(diǎn)
				cur->next = cur->next->next;//鏈表指向刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)

				delete tmp;//刪除節(jié)點(diǎn)中的元素
				tmp = nullptr;
			}
			else//如果下個(gè)節(jié)點(diǎn)不是刪除節(jié)點(diǎn),那直接指向下個(gè)節(jié)點(diǎn)
			{
				cur = cur->next;
			}
		}
	}
}

??有返回值版本

//刪除所有x的節(jié)點(diǎn),有刪除節(jié)點(diǎn)返回true,無(wú)刪除節(jié)點(diǎn)返回false
bool erase_all_x(int x)
{
	LNode* cur = _head;
	if (cur->next == nullptr)
	{
		cout << "該鏈表為空不可刪除\n";
		return false;
	}
	else
	{
		int count = 0;//設(shè)計(jì)一個(gè)計(jì)數(shù)器,統(tǒng)計(jì)是否有刪除的節(jié)點(diǎn)
		while (cur && cur->next)//刪除的數(shù)據(jù)有可能連續(xù),所以最好保持當(dāng)前節(jié)點(diǎn)
		{
			if (cur->next->data == x)
			{
				count++;//有刪除的節(jié)點(diǎn),count++
				LNode* tmp = cur->next;
				cur->next = cur->next->next;//刪除x節(jié)點(diǎn)

				delete tmp;
				tmp = nullptr;
			}
			else//如果下個(gè)節(jié)點(diǎn)不是刪除節(jié)點(diǎn),那直接指向下個(gè)節(jié)點(diǎn)
			{
				cur = cur->next;
			}
		}

		if (count == 0)//count==0,則沒有可以刪除的節(jié)點(diǎn)
		{
			cout << "鏈表中沒有可以刪除的元素" << endl;
			return false;
		}

		return true;
	}
}

?????????????

2.4計(jì)算線性表中值為偶數(shù)的節(jié)點(diǎn)個(gè)數(shù)

??我們定義函數(shù)用于遍歷鏈表并計(jì)算其中偶數(shù)節(jié)點(diǎn)的數(shù)量。首先,它檢查鏈表是否為空,如果為空,則輸出一條錯(cuò)誤消息。如果鏈表非空,它開始遍歷鏈表,檢查每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是否為偶數(shù)。如果是偶數(shù),則計(jì)數(shù)器加1。 遍歷完成后,輸出鏈表中偶數(shù)節(jié)點(diǎn)的數(shù)量。

//打印鏈表中值為偶數(shù)的節(jié)點(diǎn)個(gè)數(shù)
void print_even_number()
{
	LNode* cur = _head->next;
	int count = 0;
	if (cur == nullptr)
	{
		cout << "該鏈表為空,沒有節(jié)點(diǎn)\n";
	}
	else//核心就在不斷通過指針遍歷尋找即可
	{
		while (cur)//遍歷鏈表中的每一個(gè)節(jié)點(diǎn)
		{
			if (cur->data % 2 == 0)
			{
				count++;//如果cur為偶數(shù),計(jì)數(shù)++;
			}

			cur = cur->next;
		}

		cout << "該鏈表中偶數(shù)節(jié)點(diǎn)的個(gè)數(shù)為:" << count << endl;
	}
}

?????????????

2.5一個(gè)帶頭節(jié)點(diǎn)的單鏈表heada存放一組整數(shù),設(shè)計(jì)分裂heada算法,偶數(shù)放在heada中,奇數(shù)放在headb中

??我們定義該函數(shù)用于將鏈表中的偶數(shù)節(jié)點(diǎn)和奇數(shù)節(jié)點(diǎn)分開,使得偶數(shù)節(jié)點(diǎn)在heada鏈表中,奇數(shù)節(jié)點(diǎn)在headb鏈表中。

??函數(shù)使用兩個(gè)指針cur1和cur2分別遍歷heada和headb鏈表。在遍歷過程中,如果當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)是偶數(shù)節(jié)點(diǎn),則保持原鏈表不變,移動(dòng)cur1指針;

??如果當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)是奇數(shù)節(jié)點(diǎn),則將其從原鏈表中刪除,并添加到headb鏈表的末尾,同時(shí)移動(dòng)cur1和cur2指針。 最后,函數(shù)返回修改后的heada和headb鏈表。

//分裂鏈表,偶數(shù)在heada中,奇數(shù)在headb中
void divide_LinkList(LNode* heada, LNode* headb)
{
	LNode* cur1 = heada;
	LNode* cur2 = headb;

	while (cur1 && cur1->next)//退出循環(huán)的條件要cur1和cur1下個(gè)節(jié)點(diǎn)不為空
	{
		if (cur1->next->data % 2 == 0)//為偶數(shù)原鏈表不變
		{
			cur1 = cur1->next;//cur1直接向后移動(dòng)
		}
		else//若鏈表為奇數(shù),需要移動(dòng)放入headb中
		{
			//交換鏈表節(jié)點(diǎn)操作
			LNode* tmp = cur1->next;
			cur1->next = cur1->next->next;
			
			//調(diào)整cur2,使其獲得cur1的節(jié)點(diǎn),斷開cur1節(jié)點(diǎn)的后面節(jié)點(diǎn)的連接
			cur2->next = tmp;
			cur2->next->next = nullptr;

			//cur1和cur2各向后移動(dòng)
			cur2 = cur2->next;
		}
	}
}

?????????????

3.main函數(shù)和源碼實(shí)現(xiàn)

3.1測(cè)試實(shí)現(xiàn):

test_LinkList1();
數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

test_LinkList2();
數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

test_LinkList3();
數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

?????????????

3.2LinkList.h

#pragma once

#include<assert.h>

//定義單鏈表節(jié)點(diǎn)
typedef struct LNode
{
	int data;
	LNode* next;

	LNode(const int& val)
		:data(val)
		, next(nullptr)
	{}

}LNode;

//定義單鏈表類
class LinkList
{
public:
	//默認(rèn)構(gòu)造函數(shù)
	LinkList()
	{
		_head = new LNode(0);//創(chuàng)建頭結(jié)點(diǎn)(哨兵位節(jié)點(diǎn))
		_size = 0;
	}

	//拷貝構(gòu)造函數(shù) lt1(lt)
	LinkList(const LinkList& lt)
	{
		LNode* oldcur = lt._head->next;

		//這個(gè)this指針是新建的鏈表lt1的
		this->_head = new LNode(0);
		this->_size = 0;

		LNode* newcur = _head;
		while (oldcur)//深拷貝以完成鏈表的賦值操作
		{
			//將舊鏈表中的值賦值到新鏈表中
			LNode* tmp = new LNode(oldcur->data);

			//向后移動(dòng)新舊鏈表節(jié)點(diǎn)
			newcur->next = tmp;
			newcur = newcur->next;
			oldcur = oldcur->next;

			_size++;
		}
	}

	//析構(gòu)函數(shù)
	~LinkList()
	{
		LNode* cur = _head->next;

		while (cur)
		{
			LNode* tmp = cur;
			cur = cur->next;

			delete tmp;
			tmp = nullptr;
		}
	}

	//單鏈表打印
	void print()
	{
		LNode* cur = _head->next;

		if (cur == nullptr)
		{
			cout << "該單鏈表為空\(chéng)n";
		}
		else
		{
			cout << "該單鏈表中的元素為:";
			
			while (cur)
			{
				printf("%d->", cur->data);
				cur = cur->next;
			}

			cout << "NULL\n";
		}
	}

	//單鏈表尾插
	void push_back(const int& val)
	{
		LNode* newnode = new LNode(val);
		LNode* cur = _head;
		
		while (cur && cur->next)//找到尾結(jié)點(diǎn)
		{
			cur = cur->next;
		}

		cur->next = newnode;//尾插

		_size++;
	}

	//單鏈表頭插
	void push_front(const int& val)
	{
		LNode* newnode = new LNode(val);
		LNode* cur = _head->next;

		_head->next = newnode;
		_head->next->next = cur;

		_size++;
	}

	//單鏈表尾刪
	void pop_back()
	{
		LNode* cur = _head->next;
		LNode* prev = _head;

		if (cur == nullptr)
		{
			cout << "單鏈表為空不可刪除\n";
		}
		else
		{
			while (cur && cur->next)//找到尾結(jié)點(diǎn)和前一個(gè)節(jié)點(diǎn)
			{
				cur = cur->next;
				prev = prev->next;
			}

			prev->next = nullptr;
			delete cur;
			cur = nullptr;
		
			_size--;
		}
	}

	//單鏈表頭刪
	void pop_front()
	{
		LNode* cur = _head->next;

		if (cur == nullptr)
		{
			cout << "單鏈表為空不可刪除\n";
		}
		else
		{
			_head->next = cur->next;

			delete cur;
			cur = nullptr;
		
			_size--;
		}
	}

	//頭插法創(chuàng)建n個(gè)元素
	void push_front_n()
	{
		cout << "請(qǐng)輸入要插入的元素個(gè)數(shù):";
		int n;
		cin >> n;
		cout << endl;
		cout << "輸入要插入的元素:";
		while (n)
		{
			int tmp;
			cin >> tmp;
			push_front(tmp);
			//LNode* newnode = new LNode(tmp);
			//LNode* cur = _head->next;
			//if (cur == nullptr)
			//{
			//	_head->next = newnode;
			//}
			//else
			//{
			//	newnode->next = cur;
			//	_head->next = newnode;
			//}

			n--;
			//_size++;
		}
	}

	//刪除第n個(gè)元素
	void erase(int n)
	{
		assert(n > 0 && n <= _size);

		LNode* cur = _head;
		if (cur->next == nullptr)
		{
			cout << "該鏈表為空不可刪除\n";
			return;
		}
		else
		{
			LNode* tmp = cur;
			while (n)//找到刪除節(jié)點(diǎn)的前一個(gè)位置
			{
				tmp = cur;
				cur = cur->next;
				n--;
			}

			tmp->next = tmp->next->next;
			delete cur;
			cur = nullptr;
		}
	}

	//單鏈表節(jié)點(diǎn)個(gè)數(shù)
	void print_size()
	{
		cout << "單鏈表節(jié)點(diǎn)個(gè)數(shù)為:" << _size << endl;
	}

	//刪除所有x的節(jié)點(diǎn),有刪除節(jié)點(diǎn)返回true,無(wú)刪除節(jié)點(diǎn)返回false
	bool erase_all_x(int x)
	{
		LNode* cur = _head;
		if (cur->next == nullptr)
		{
			cout << "該鏈表為空不可刪除\n";
			return false;
		}
		else
		{
			int count = 0;//設(shè)計(jì)一個(gè)計(jì)數(shù)器,統(tǒng)計(jì)是否有刪除的節(jié)點(diǎn)
			while (cur && cur->next)//刪除的數(shù)據(jù)有可能連續(xù),所以最好保持當(dāng)前節(jié)點(diǎn)
			{
				if (cur->next->data == x)
				{
					count++;//有刪除的節(jié)點(diǎn),count++
					LNode* tmp = cur->next;
					cur->next = cur->next->next;//刪除x節(jié)點(diǎn)

					delete tmp;
					tmp = nullptr;
				}
				else//如果下個(gè)節(jié)點(diǎn)不是刪除節(jié)點(diǎn),那直接指向下個(gè)節(jié)點(diǎn)
				{
					cur = cur->next;
				}
			}

			if (count == 0)//count==0,則沒有可以刪除的節(jié)點(diǎn)
			{
				cout << "鏈表中沒有可以刪除的元素" << endl;
				return false;
			}

			return true;
		}
	}

	//打印鏈表中值為偶數(shù)的節(jié)點(diǎn)個(gè)數(shù)
	void print_even_number()
	{
		LNode* cur = _head->next;
		int count = 0;
		if (cur == nullptr)
		{
			cout << "該鏈表為空,沒有節(jié)點(diǎn)\n";
		}
		else
		{
			while (cur)//遍歷鏈表中的每一個(gè)節(jié)點(diǎn)
			{
				if (cur->data % 2 == 0)
				{
					count++;//如果cur為偶數(shù),計(jì)數(shù)++;
				}

				cur = cur->next;
			}

			cout << "該鏈表中偶數(shù)節(jié)點(diǎn)的個(gè)數(shù)為:" << count << endl;
		}
	}

	//返回當(dāng)前鏈表的頭結(jié)點(diǎn)
	LNode* get_head()
	{
		return _head;
	}

	//分裂鏈表,偶數(shù)在heada中,奇數(shù)在headb中
	void divide_LinkList(LNode* heada, LNode* headb)
	{
		LNode* cur1 = heada;
		LNode* cur2 = headb;

		while (cur1 && cur1->next)
		{
			if (cur1->next->data % 2 == 0)//為偶數(shù)原鏈表不變
			{
				cur1 = cur1->next;
			}
			else//若鏈表為奇數(shù),需要移動(dòng)放入headb中
			{
				//交換鏈表節(jié)點(diǎn)操作
				LNode* tmp = cur1->next;
				cur1->next = cur1->next->next;

				cur2->next = tmp;
				cur2->next->next = nullptr;

				//cur1和cur2各向后移動(dòng)
				cur2 = cur2->next;
			}
		}
	}

private:
	LNode* _head;
	int _size;
};

?????????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723886.html

3.3test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

#include"LinkList.h"

void test_LinkList1()
{
	LinkList lt;
	//鏈表打印
	lt.print();

	//測(cè)試空鏈表刪除
	lt.pop_front();

	//尾插
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.print();

	//頭插
	lt.push_front(5);
	lt.push_front(6);
	lt.push_front(7);
	lt.push_front(8);
	lt.print();
	
	//打印鏈表節(jié)點(diǎn)
	lt.print_size();

	//尾刪
	lt.pop_back();
	lt.pop_back();
	lt.print();

	//頭刪
	lt.pop_front();
	lt.pop_front();
	lt.print();
	lt.print_size();
}

void test_LinkList2()
{
	//頭插法創(chuàng)建n個(gè)元素的鏈表
	LinkList lt;
	lt.push_front_n();
	lt.print();
	lt.print_size();
}

void test_LinkList3()
{
	LinkList lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(7);
	lt.push_back(8);
	lt.push_back(9);
	lt.push_back(10);
	lt.print();
	lt.print_size();

	lt.push_back(6);
	lt.push_back(6);
	lt.push_back(6);

	//刪除第11節(jié)點(diǎn)的元素
	lt.erase(11);
	lt.print();

	//刪除所有元素為6的節(jié)點(diǎn)
	cout << "是否刪除成功:" << lt.erase_all_x(6) << endl;
	lt.print();

	cout << "是否刪除成功:" << lt.erase_all_x(6) << endl;
	lt.print();

	//打印所有節(jié)點(diǎn)為偶數(shù)的個(gè)數(shù)
	lt.print_even_number();

	//拷貝構(gòu)造函數(shù)
	LinkList lt1(lt);
	lt1.print();
	lt1.print_size();

	//編譯器生成了默認(rèn)的賦值運(yùn)算符重載
	LinkList lt2 = lt1;
	lt2.print();

	//創(chuàng)建空鏈表
	LinkList lt3;
	lt3.print();

	lt1.push_back(11);
	lt1.push_back(14);
	lt1.push_back(12);
	lt1.push_back(13);
	lt1.print();

	//分離鏈表lt1,使lt1只含有偶數(shù),lt3只含有奇數(shù)
	lt1.divide_LinkList(lt1.get_head(), lt3.get_head());
	lt1.print();
	lt3.print();
}

int main()
{
	//不想輸入數(shù)據(jù)就調(diào)用test_LinkList1()或test_LinkList3();
	//test_LinkList1();
	//test_LinkList2();
	test_LinkList3();
	return 0;
}

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)上機(jī)練習(xí)——單鏈表的基本操作、頭文件、類定義、main函數(shù)、多種鏈表算法的實(shí)現(xiàn),含注釋的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表——單鏈表的定義及基本操作的實(shí)現(xiàn)(頭插、尾插、頭刪、尾刪、任意位置的插入與刪除)

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表——單鏈表的定義及基本操作的實(shí)現(xiàn)(頭插、尾插、頭刪、尾刪、任意位置的插入與刪除)

    ?????作者: @情話0.0 ??專欄:《數(shù)據(jù)結(jié)構(gòu)》 ??個(gè)人簡(jiǎn)介:一名雙非編程菜鳥,在這里分享自己的編程學(xué)習(xí)筆記,歡迎大家的指正與點(diǎn)贊,謝謝! ??順序表可以隨時(shí)存取表中的任意一個(gè)元素,它的存儲(chǔ)位置可以用一個(gè)簡(jiǎn)單直觀的公式表示,但是插入和刪除操作需要移動(dòng)

    2024年02月19日
    瀏覽(1193)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表基本操作實(shí)現(xiàn) (c++)

    數(shù)據(jù)結(jié)構(gòu)——單鏈表基本操作實(shí)現(xiàn) (c++)

    單鏈表鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn)是:用一組任意的存儲(chǔ)單元存儲(chǔ)線性表的數(shù)據(jù)元素(這里存儲(chǔ)單元可以是連續(xù)的,也可以是不連續(xù)的),為了表示每個(gè)數(shù)據(jù)元素a與其直接后繼數(shù)據(jù)元素之間的邏輯關(guān)系,除了存儲(chǔ)信息本身外還要存儲(chǔ)一個(gè)指示其直接后繼的信息(地址). 這兩部分信

    2024年02月03日
    瀏覽(88)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表的查找、求單鏈表長(zhǎng)度、單鏈表的創(chuàng)建

    數(shù)據(jù)結(jié)構(gòu)——單鏈表的查找、求單鏈表長(zhǎng)度、單鏈表的創(chuàng)建

    一、單鏈表的查找 1.按位查找 ==GetElem(L, i): == 按位查找操作,獲取表 L 中第 i 個(gè)位置的元素的值 ; ? 平均時(shí)間復(fù)雜度O(n) 2.按值查找 ==LocateElem(L, e)==: 按值查找操作,在表 L 中查找具有給定值的元素 ; 二、求單鏈表的長(zhǎng)度 == Length(LinkList L)== :計(jì)算單鏈表中數(shù)據(jù)結(jié)點(diǎn)(

    2024年01月21日
    瀏覽(7)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表上基本操作的實(shí)現(xiàn)

    1.按位序插入(帶頭結(jié)點(diǎn)) : ==ListInsert(L, i, e): ==在表L 中的第 i 個(gè)位置上插入指定元素 e = 找到第 i-1 個(gè)結(jié)點(diǎn) ( 前驅(qū)結(jié)點(diǎn) ) ,將新結(jié)點(diǎn) 插入其后;其中頭結(jié)點(diǎn)可以看作第 0 個(gè)結(jié)點(diǎn),故 i=1 時(shí)也適用。 typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList; // 在第 i 個(gè)位置插入

    2024年01月21日
    瀏覽(91)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表基本操作:查找、插入、刪除、創(chuàng)建

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表基本操作:查找、插入、刪除、創(chuàng)建

    ?鏈表由結(jié)點(diǎn)組成,結(jié)點(diǎn)由數(shù)據(jù)域和指針域組成。其中,數(shù)據(jù)域存放的就是數(shù)據(jù)元素,指針域存放下一個(gè)結(jié)點(diǎn)的地址。數(shù)據(jù)元素可以只有一個(gè),也可以有多個(gè)不同類型的數(shù)據(jù)元素,甚至是數(shù)組。下圖和代碼來(lái)自《C Primer Plus》,該鏈表每個(gè)節(jié)結(jié)點(diǎn)同時(shí)含char類型和int類型。 ??

    2024年02月02日
    瀏覽(97)
  • 【(數(shù)據(jù)結(jié)構(gòu))— 單鏈表的實(shí)現(xiàn)】

    【(數(shù)據(jù)結(jié)構(gòu))— 單鏈表的實(shí)現(xiàn)】

    概念: 鏈表是?種 物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、 非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的 邏輯順序 是通過鏈表中的 指針鏈接 次序?qū)崿F(xiàn)的 。 鏈表的結(jié)構(gòu)跟???廂相似,淡季時(shí)?次的?廂會(huì)相應(yīng)減少,旺季時(shí)?次的?廂會(huì)額外增加?節(jié)。只需要將???的某節(jié)?廂去掉/加上,不會(huì)影響

    2024年02月08日
    瀏覽(102)
  • 數(shù)據(jù)結(jié)構(gòu)--單鏈表的定義

    數(shù)據(jù)結(jié)構(gòu)--單鏈表的定義

    單鏈表的定義(如何用代碼實(shí)現(xiàn)) 優(yōu)點(diǎn):不要求大片連續(xù)空間,改變?nèi)萘糠奖?缺點(diǎn):不可隨機(jī)存取,要耗費(fèi)一定空間存放指針 為了方便 我們經(jīng)常使用 typedef t y p e d e f 數(shù)據(jù)類型 別名 color{purple}typedef 數(shù)據(jù)類型 別名 t y p e d e f 數(shù)據(jù)類型 別名 代碼一: 代碼二: 代碼一與代碼二是

    2024年02月11日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的實(shí)現(xiàn)

    ??個(gè)人主頁(yè):平凡的小蘇 ??學(xué)習(xí)格言:別人可以拷貝我的模式,但不能拷貝我不斷往前的激情 ??C語(yǔ)言專欄:https://blog.csdn.net/vhhhbb/category_12174730.html ??數(shù)據(jù)結(jié)構(gòu)專欄:https://blog.csdn.net/vhhhbb/category_12211053.html ? ? ? ? 家人們更新不易,你們的??點(diǎn)贊??和?關(guān)注?真的對(duì)我

    2023年04月09日
    瀏覽(93)
  • 【數(shù)據(jù)結(jié)構(gòu)—單鏈表的實(shí)現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu)—單鏈表的實(shí)現(xiàn)】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 目錄 前言 1. 鏈表的概念及結(jié)構(gòu) 2. 單鏈表的實(shí)現(xiàn) 2.1單鏈表頭文件——功能函數(shù)的定義 2.2單鏈表源文件——功能函數(shù)的實(shí)現(xiàn) 2.3 單鏈表源文件——功能的測(cè)試 3.具體的理解操作圖 4. 鏈表的分類 總結(jié) 世上

    2024年02月05日
    瀏覽(93)
  • 【數(shù)據(jù)結(jié)構(gòu)】-- 單鏈表的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】-- 單鏈表的實(shí)現(xiàn)

    在前面我們學(xué)習(xí)了順序表,順序表在數(shù)組的基礎(chǔ)上提供了很多現(xiàn)成的方法,方便了我們對(duì)數(shù)據(jù)的管理,但是我們也發(fā)現(xiàn)順序表有著許多不足: 在處理大型的數(shù)據(jù)時(shí),需要頻繁的增容且在中間刪除或插入數(shù)據(jù)時(shí)需要遍歷順序表,這些性質(zhì)導(dǎo)致了順序表的 效率較低 。這時(shí)我們就

    2024年04月27日
    瀏覽(111)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包