源码内容:基于链表的列表(使用链表实现 Verctor::push_back 以及 Verctor::pop_back)
· 基于链表的列表 ·
template <typename T>
class linkedList
{
public:
linkedList(); //初始化链表
bool empty() const; //判空
int size() const; //输入实际大小
void push_back(const T &item); //输入链表,添加此节点
void pop_back(); //删除最后一个节点
void insert(T item, int pos); //添加到指定位置的值
void erase(int pos); //删除指定位置的值
friend ostream &operator<<(ostream &out, const linkedList<T> &aList); //重载
private:
node<T> *header; //头结点
int lsize; //输入实际大小
};
template <typename T>
linkedList<T>::linkedList() : header(NULL), lsize(0)
{
} //初始化定义首地址为空,大小为0
template <typename T>
bool linkedList<T>::empty() const //判空,大小为0为false
{
return (lsize == 0);
}
template <typename T>
int linkedList<T>::size() const //输入实际大小
{
return lsize;
}
template <typename T>
void linkedList<T>::insert(T item, int pos) // 在第几个位置前插入值item
{
node<T> *newNode = new node<T>(item); //新建节点
node<T> *temp = header; //首地址
if ((newNode == NULL) && (pos < 0) && (pos > lsize))
{
throw memoryAllocationError("Error");
} //如果新建节点不成功抛出错误
if (header == NULL) //首地址为空,新建的节点就是首节点
{
header = newNode; //新节点给首地址
}
else if (pos == 1) //不为空但是放在第一个前边
{
newNode->next = temp; //新节点下一个指向原来的首地址
header = newNode; //首地址就由新节点代替
}
else //不是第一个前边的
{
int bpos = 1; //作为一个比较大小的数值
node<T> *prev; //新定义一个节点
while (bpos < pos) //知道找到要插入的位置
{
prev = temp;
temp = temp->next; //节点后移方便查找
bpos++; //当是pos前的一个时是prev是pos前一个 temp已经是pos了
}
newNode->next = temp; //放到该位置前边(可以由此改)
prev->next = newNode; //此时prev是pos前边的一个
}
}
template <typename T>
void linkedList<T>::erase(int pos) // 删除节点的位置为pos
{
node<T> *tmp = header, tmpptr; //新建节点
if ((header == NULL) && (pos < 0) && (pos > lsize)) //没有节点或者位置出错抛出错误
{
throw memoryAllocationError("Error");
}
if (pos == 1) //删除第一个位置
{
header = header->next; //头地址直接指向下一个
}
else
{
int bpos = 1;
node<T> *prev;
while (bpos < lsize) //同样是比较大小查找相应数值
{
prev = tmp;
tmp = tmp->next;
bpos++;
}
prev->next = tmp->next; //tmp的前一个直接指向tmp的后一个,删除tmp
}
}
template <typename T>
void linkedList<T>::push_back(const T &item) //添加进链表最后边一个值
{
node<T> *newNode = new node<T>(item); //新建节点
node<T> *tmp = header; //首地址保存
if (newNode == NULL) //建立节点出错抛错
throw memoryAllocationError("linkedQueue: memory allocation failure");
if (header == NULL) //原链表为空,新节点为首节点
{
header = newNode;
}
else //否则不为空
{
while (tmp->next != NULL)
tmp = tmp->next; //找到链表内最后一个数值
tmp->next = newNode; //最后一个指向新节点
}
lsize++; //实际大小加1
}
template <typename T>
void linkedList<T>::pop_back() //删除最后一个数据
{
node<T> *tmp = header, last, tmpptr; //设置新节点
if (header == NULL) //如果链表不存在就无法删除
{
exit(0);
}
else //链表存在
{
if (tmp->next == NULL)
{
tmpptr = header;
delete tmpptr;
header = NULL;
} //首地址指向空,说明只有一个结点
else //多个节点
{
while (tmp->next->next != NULL)
tmp = tmp->next; //找到倒数第二个
last = tmp->next; //last是最后一个
delete last; //删除最后一个
tmp->next = NULL; //最后一个为空
}
}
lsize++;
}
template <typename T>
ostream &operator<<(ostream &out, const linkedList<T> &aList) //重载
{
node<T> *temp;
temp = aList.header;
while (temp != NULL)
{
out << temp->nodeValue;
temp = temp->next;
out << " ";
}
return out;
}
void main() //调用实验实现
{
linkedList<int> A;
A.push_back(43);
A.push_back(21);
A.push_back(33);
cout << A;
cout << endl;
A.insert(99, 1);
cout << A;
cout << endl;
A.erase(1);
cout << A;
cout << endl;
system("pause");
}
结果: