注意
- 链表中要包含Node的结构体,用来把节点放进去
- 只有出现Node就要加<T> ,不然会报错
- 有类模板的重新编译记得清空再重新生成
- 清除链表时使用的循环清空头结点的思想需要记得(C语言中一样循环调用清除0号元素也可以)
- 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也要加上<T>
};
头文件
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永远和<T>在一起
//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后面也要<T>
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();