IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 22.数据结构-单链表的具体实现 -> 正文阅读

[数据结构与算法]22.数据结构-单链表的具体实现


下面实现上一节单链表的插入和删除操作

LinkList.h(未优化)

#ifndef  __LINK_LIST_
#define  __LINK_LIST_


namespace DTlib
{
	template<class T>
	class LinkList
	{
	protected:
		struct Node
		{
			T	  value;
			Node* next;
		};

		mutable Node m_header;
		int m_length;
	public:
		LinkList();
		~LinkList();
		bool insert(int i,T& e);
		bool remove(int i);
		bool set(int i, T& e);
		T get(int i) const;
		int length() const;
		void clear();
	};
}


#endif

LinkList.cpp(未优化)

#include "LinkList.h"
#include <iostream>

using namespace DTlib;
using namespace std;
template<class T>
LinkList<T>::LinkList()
{
	m_header.next = NULL;
	m_length = 0;
}

template<class T>
bool LinkList<T>::insert(int i,T&e)
{
	bool ret = (i >= 0) && (i <= m_length);
	if (ret)
	{
		Node* node = new Node();

		if (node != NULL)
		{
			Node*  pre = &m_header;

			for (int pos = 0; pos < i; pos++)
			{
				pre = pre->next;
			}

			node->value = e;
			node->next = pre->next;
			pre->next = node;
		}
		else
		{
			cout << "no memery to malloc" << endl;
		}
	}

	m_length++;
	return ret;
}


template<class T>
bool LinkList<T>::remove(int i)
{
	bool ret = (i >= 0) && (i <= m_length);
	
	if (ret)
	{
		Node* pre = &m_header;
		for (int pos = 0; pos < i; pos++)
		{
			pre = pre->next;
		}

		Node* toDel = pre->next;
		pre->next = toDel->next;
		delete toDel;
		m_length--;
	}

	return ret;
}

template<class T>
bool LinkList<T>::set(int i, T& e)
{
	bool ret = (i >= 0) && (i <= m_length);

	if (ret)
	{
		Node* pre = &m_header;
		for (int pos = 0; pos < i; pos++)
		{
			pre = pre->next;
		}

		pre->next->value = e;
	}

	return ret;
}

template<class T>
T LinkList<T>::get(int i) const
{
	bool ret = (i >= 0) && (i <= m_length);
	T e;

	if (ret)
	{
		Node* pre = &m_header;
		for (int pos = 0; pos < i; pos++)
		{
			pre = pre->next;
		}

		e = pre->next->value;
	}

	return e;
}


template<class T>
int  LinkList<T>::length() const
{
	return m_length;
}

template<class T>
void LinkList<T>::clear()
{
	
	while(m_header.next != NULL)
	{
		Node* toDel = m_header.next;
		m_header.next = toDel->next;
		delete toDel;
	}

	m_length = 0;
}

template<class T>
LinkList<T>::~LinkList()
{
	clear();
}

int main()
{
	LinkList<int> l;
	for (int i = 0; i < 5; i++)
	{
		l.insert(i,i);
	}

	for (int i = 0; i < l.length(); i++)
	{
		cout << l.get(i) << endl;
	}


	return 0;
}

单链表的优化

1.头结点的优化

单链表在构建时必须先创建头结点,头结点在创建时必须调用具体类型的构造函数,如果具体类型的构造函数抛出异常,则单链表对象将构建失败,并会传递具体类型构造函数的异常

class Test
{
public:
  Test()
  {
    throw 0;
  }
};

int main()
{
  LinkedList<Test> l;
  return 0;
}

创建一个内存布局与链表相同的头结点,在创建头结点的时候不会调用构造函数,

mutable struct:public Object
 {
   char reserved[sizeof(T)];//占位空间,与T类型的大小一样
   Node* next;
 }m_header;

2、目标位置定位的代码优化

单链表的操作中经常需要找到目标位置,可以将此部分代码独立出来。

Node* position(int index)const
 {
   //类型转换
   Node* ret = reinterpret_cast<Node*>(&m_header);
 
   for(int i = 0; i < index; i++)
   {
       ret = ret->next;
   }
   return ret;
}

3.增加查找操作

增加一个find操作,查找第一个出现查找值的地方
virtual int find(const T& value)const = 0;

int find(const T& value)const
    {
        int ret = -1;
        Node* node = m_header.next;
        int i = 0;
        while(node)
        {
            if(node->value == value)
            {
                ret = i;
                break;
            }
            else
            {
                node = node->next;
                 i++;
            }
        }
        return ret;
    }

4.LinkList.h(已优化)

#ifndef  __LINK_LIST_
#define  __LINK_LIST_

namespace DTlib
{
	template<class T>
	class LinkList
	{
	public:
		struct Node
		{
			T	  value;
			Node* next;
		};

		mutable struct
		{
		  char reverse[sizeof(T)];
		  Node* next;
		} m_header;
	
		int m_length;
		
		Node* position(int i)const
		{
			Node*  pre =  reinterpret_cast<Node*>(&m_header);
			for (int pos = 0; pos < i; pos++)
			{
				pre = pre->next;
			}
	
			return pre;
		}
	public:
		LinkList();
		~LinkList();
		bool insert(int i,T& e);
		bool remove(int i);
		bool set(int i, T& e);
		T get(int i) const;
		int length() const;
		void clear();
	};
}


#endif

5.LinkList.cpp(已优化)

#include "LinkList.h"
#include <iostream>

using namespace DTlib;
using namespace std;

template<class T>
LinkList<T>::LinkList()
{
	m_header.next = NULL;
	m_length = 0;
}

/*template<class T>
Node* LinkList<T>::position(int i)const
{
	Node*  pre =  reinterpret_cast<Node*>(&m_header);
	for (int pos = 0; pos < i; pos++)
	{
		pre = pre->next;
	}
	
	return pre;
}*/


template<class T>
bool LinkList<T>::insert(int i,T&e)
{
	bool ret = (i >= 0) && (i <= m_length);
	if (ret)
	{
		Node* node = new Node();

		if (node != NULL)
		{
			Node*  pre =  reinterpret_cast<Node*>(&m_header);

			pre = position(i);

			node->value = e;
			node->next = pre->next;
			pre->next = node;
		}
		else
		{
			cout << "no memery to malloc" << endl;
		}
	}

	m_length++;
	return ret;
}


template<class T>
bool LinkList<T>::remove(int i)
{
	bool ret = (i >= 0) && (i <= m_length);
	
	if (ret)
	{
		Node*  pre =  reinterpret_cast<Node*>(&m_header);
		
		pre = position(i);

		Node* toDel = pre->next;
		pre->next = toDel->next;
		delete toDel;
		m_length--;
	}

	return ret;
}

template<class T>
bool LinkList<T>::set(int i, T& e)
{
	bool ret = (i >= 0) && (i <= m_length);

	if (ret)
	{
		Node*  pre =  reinterpret_cast<Node*>(&m_header);
		
		pre = position(i);
		
		pre->next->value = e;
	}

	return ret;
}

template<class T>
T LinkList<T>::get(int i) const
{
	bool ret = (i >= 0) && (i <= m_length);
	T e;

	if (ret)
	{
		Node*  pre =  reinterpret_cast<Node*>(&m_header);
		
		pre = position(i);

		e = pre->next->value;
	}

	return e;
}


template<class T>
int  LinkList<T>::length() const
{
	return m_length;
}

template<class T>
void LinkList<T>::clear()
{
	
	while(m_header.next != NULL)
	{
		Node* toDel = m_header.next;
		m_header.next = toDel->next;
		delete toDel;
	}

	m_length = 0;
}

template<class T>
LinkList<T>::~LinkList()
{
	clear();
}

int main()
{
	LinkList<int> l;
	for (int i = 0; i < 5; i++)
	{
		l.insert(i,i);
	}

	for (int i = 0; i < l.length(); i++)
	{
		cout << l.get(i) << endl;
	}


	return 0;
}

结果为:

0
1
2
3
4

position函数在类内实现会报下面错误,哪位大佬可以解答一下
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:52:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:19:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码