C++模板类实现链表

注意

  1. 链表中要包含Node的结构体,用来把节点放进去
  2. 只有出现Node就要加 ,不然会报错
  3. 有类模板的重新编译记得清空再重新生成
  4. 清除链表时使用的循环清空头结点的思想需要记得(C语言中一样循环调用清除0号元素也可以)
  5. Debug和Release编译不同,一步一步执行时顺序不一样,不知道为啥了,不过不重要,结果一样

自己写的清空函数

template <typename T>
void Link<T>::clear()
{
	//先把原来的内存都删除掉
	Node<T>* tmp = NULL;
	tmp = head;
	while (head->next != NULL)
	{
		del(0);
	}
}

原本的清除函数

template <typename T>
void Link<T>::clear()
{
	//先把原来的内存都删除掉
	Node<T>* tmp = NULL;
	tmp = head;
	while (head != NULL)
	{
		tmp = head->next;//临时缓存后面的变量
		delete head;//释放当前变量
		head = tmp;//指向后面的变量

	}
	//创建新的头结点
	head = new Node<T>;
	head->next = NULL;
	len = 0;
}

需要增加的新节点(与线性表不同的地方)

template <typename T>
struct Node
{
	T t;
	Node<T>* next;//注意这里的node也要加上
};

头文件

template <typename T>
class Link
{
public:
	Link();


	~Link();

	int getlen();


	int insert(const T& t, int pos);

	T del(int pos);

	T get(int pop);

	void clear();


private:
	int len;
	Node<T>* head;
};

构造函数

template <typename T>
Link<T>::Link()
{
		head = new Node<T>;//!!!注意Node永远和在一起
		//memset(head, 0, sizeof(T));//注意不要用memset 涉及到Teacher 把下一个指针置空就可以
		head->next = NULL;
		len = 0;
}

析构函数


template <typename T>
Link<T>::~Link()
{
	Node<T>* tmp = NULL;//模板记得加
	tmp = head;
	while (head!=NULL)
	{
		tmp = head->next;//临时缓存后面的变量
		delete head;//释放当前变量
		head = tmp;//指向后面的变量

		//想法 删掉头结点 使下一个节点变成头结点 但是不行 所以引入辅助变量 把head的next缓存下来
		//delete head
		//head = head->next;

	}
	len = 0;
	head = NULL;
}

插入删除和读取

template <typename T>
int Link<T>::insert(const T& t1, int pos)
{
	Node<T> *node=new Node<T>;//注意这里的new后面也要
	node->t = t1;
	Node<T>* current = NULL;
	current = head;

	if (pos < 0||node==NULL)
	{
		cout << "error in insert" << endl;
		return -1;
	}
	if (pos > len)
	{
		pos = len;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}
	//新节点先连接
	node->next = current->next;
	current->next = node;

	len++;//记得加长度
	return 0;

}

template <typename T>
T Link<T>::del(int pos)
{

	Node<T>* current = NULL;
	current = head;

	if (pos < 0 )
	{
		cout << "error in del" << endl;

	}
	if (pos >= len)
	{
		pos = len-1;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}

	Node<T>* node = NULL;
	node = current->next;
	T tmp = node->t;
	current->next = node->next;
	//删掉node的内存
	delete node;
	len--;//长度减1
	return tmp;
}

template <typename T>
T Link<T>::get(int pos)
{
	Node<T>* current = NULL;
	current = head;

	if (pos < 0 )
	{
		cout << "error in get" << endl;

	}
	if (pos >= len)
	{
		pos = len - 1;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}
	current = current->next;
	return current->t;
}

最后是测试CPP

	Teacher t1, t2, t3;
	t1.age = 31;
	strcpy(t1.name, "t1t1t1");
	strcpy(t1.worknum, "num1");
	t2.age = 32;
	strcpy(t2.name, "t2t2t2");
	strcpy(t2.worknum, "num2");
	t3.age = 33;
	strcpy(t3.name, "t3t3t3");
	strcpy(t3.worknum, "num3");

	Link<Teacher> link;//类模板的参数 记得<>


	link.insert(t2, 0);
	link.insert(t1, 0);
	link.insert(t3, 2);

	cout << link.getlen() << endl;

	Teacher tmp;

	for (int i = 0;i < link.getlen();i++)
	{
		tmp = link.get(i);
		cout << tmp.name << endl;
	}

	tmp = link.del(1);
	cout << tmp.name << endl;

	link.clear();

你可能感兴趣的:(数据结构,链表)