链表(1)基本操作:创建,插入,删除,销毁等(模板类实现)
2018-04-01 20:54
671 查看
用c++的类模板实现链表的基本操作,包括创建,插入,删除,销毁等。
以后会在链表类里面加入更多的方法。
#include<iostream>
using namespace std;
template<class T>
struct node
{
T data;
node<T>* next;
node(node<T> *p = NULL) //一个构造函数 (写了一下,后面却没用到)
{
next = p;
}
node(const T& item, node<T>*p = NULL) //一个有指针和数据的构造函数
{
data = item;next = p;
}
};
template<class T>
class linklist {
private:
node<T>* head;
int len; //当前长度
node<T>* endnode; //最后一个元素的位置
public:
linklist() {
head = new node<T>();
len = 0;
endnode = head;
}
//在线性表尾部插入一个元素
void insert_end(T item);
//在线性表的第pos个元素之后加入一个元素
void insert_pos(T item, int pos);
//删除链表的第pos个元素
void delete_pos(int pos);
void print(); //打印线性表
int getlength() { return len; }//返回长度
void destory();//销毁的意为释放所有节点的内存;
};
//在表的最后一个位置插入一个数据
template <class T>
void linklist<T>::insert_end(T item)
{
node<T>* newnode = new node<T>(item);
endnode->next = newnode;
endnode = newnode;
len++;
}
//打印链表
template<class T>
void linklist<T>::print()
{
node<T>*p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}cout << endl;
}
//在线性表的第pos个元素之后加入一个元素
template<class T>
void linklist<T>::insert_pos(T item, int pos)
{
if (pos<0 || pos>len) { cout << "输入的位置有问题" << endl; return; }
node<T>*p = head;
for (int i = 0;i <pos;i++)
{
p = p->next;
}
node<T> *newnode = new node<T>(item);
newnode->next = p->next;
p->next = newnode;//如果插入的位置是最后,更新最后一个元素的位置
if (pos == len)
{
endnode = newnode;
}
len++;
}
//删除链表的第pos个元素
template<class T>
void linklist<T>::delete_pos(int pos)
{
if (pos<1 || pos>len) { cout << "删除元素的位置不对" << endl;return; }
node<T>* p, *q; //pq为要删除的元素的位置前后
p = head;q = head;
//先找到要删除的前一个元素的位置
for (int i = 0;i < pos - 1;i++)
{
p = p->next;
}
//找到删除链表的后一个元素的位置
for (int i = 0;i < pos + 1;i++)
{
q = q->next;
}
//删掉结点,前面和后面的连接
delete p->next;
p->next = q;
//如果被删的元素是最后一个,重新定位最后一个指针
if (pos == len)
{
endnode = p;
}
len--;//链表长度减一
}
//销毁这个链表的节点(保留头部)
template<class T>
void linklist<T>::destory()
{
if (len == 0) return;
node<T>*p, *q;p = head->next;
for (int i = 0;i < len;i++)
{
q = p->next;
cout << "正在删除第" << i + 1 << "个元素 " << p->data << endl;
delete p;
p = q;
}
cout << "删除完成" << endl;
len = 0;
}
int main()
{
linklist<int> a;
for (int i = 1;i <= 10;i++) //先创建链表123456789 10
{
a.insert_end(i);
}
a.print();
a.insert_pos(999, 5);a.print(); //在第5个元素后面插入一个元素999
a.insert_pos(999, 11); a.print(); //在第11个元素后面插入一个元素999
a.delete_pos(5);a.print(); //删除第5个元素
a.insert_end(20);a.print(); //在末尾插入一个元素20
a.delete_pos(12);a.print(); //删除第12个元素
a.insert_end(200);a.print(); //在末尾插入一个元素200
a.insert_end(201);a.print(); //在末尾插入一个元素201
a.delete_pos(12);a.print(); //删除第12个元素
a.insert_end(200);a.print(); //在末尾插入一个元素200
a.delete_pos(1);a.print(); //删除第1个元素
a.delete_pos(1);a.print(); //删除第1个元素
getchar();
a.destory();
getchar();
return 0;
}主函数是用来测试之用。下图是运行结果。
之后会用链表实现更多的功能,类里面会添加更多方法。
以后会在链表类里面加入更多的方法。
#include<iostream>
using namespace std;
template<class T>
struct node
{
T data;
node<T>* next;
node(node<T> *p = NULL) //一个构造函数 (写了一下,后面却没用到)
{
next = p;
}
node(const T& item, node<T>*p = NULL) //一个有指针和数据的构造函数
{
data = item;next = p;
}
};
template<class T>
class linklist {
private:
node<T>* head;
int len; //当前长度
node<T>* endnode; //最后一个元素的位置
public:
linklist() {
head = new node<T>();
len = 0;
endnode = head;
}
//在线性表尾部插入一个元素
void insert_end(T item);
//在线性表的第pos个元素之后加入一个元素
void insert_pos(T item, int pos);
//删除链表的第pos个元素
void delete_pos(int pos);
void print(); //打印线性表
int getlength() { return len; }//返回长度
void destory();//销毁的意为释放所有节点的内存;
};
//在表的最后一个位置插入一个数据
template <class T>
void linklist<T>::insert_end(T item)
{
node<T>* newnode = new node<T>(item);
endnode->next = newnode;
endnode = newnode;
len++;
}
//打印链表
template<class T>
void linklist<T>::print()
{
node<T>*p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}cout << endl;
}
//在线性表的第pos个元素之后加入一个元素
template<class T>
void linklist<T>::insert_pos(T item, int pos)
{
if (pos<0 || pos>len) { cout << "输入的位置有问题" << endl; return; }
node<T>*p = head;
for (int i = 0;i <pos;i++)
{
p = p->next;
}
node<T> *newnode = new node<T>(item);
newnode->next = p->next;
p->next = newnode;//如果插入的位置是最后,更新最后一个元素的位置
if (pos == len)
{
endnode = newnode;
}
len++;
}
//删除链表的第pos个元素
template<class T>
void linklist<T>::delete_pos(int pos)
{
if (pos<1 || pos>len) { cout << "删除元素的位置不对" << endl;return; }
node<T>* p, *q; //pq为要删除的元素的位置前后
p = head;q = head;
//先找到要删除的前一个元素的位置
for (int i = 0;i < pos - 1;i++)
{
p = p->next;
}
//找到删除链表的后一个元素的位置
for (int i = 0;i < pos + 1;i++)
{
q = q->next;
}
//删掉结点,前面和后面的连接
delete p->next;
p->next = q;
//如果被删的元素是最后一个,重新定位最后一个指针
if (pos == len)
{
endnode = p;
}
len--;//链表长度减一
}
//销毁这个链表的节点(保留头部)
template<class T>
void linklist<T>::destory()
{
if (len == 0) return;
node<T>*p, *q;p = head->next;
for (int i = 0;i < len;i++)
{
q = p->next;
cout << "正在删除第" << i + 1 << "个元素 " << p->data << endl;
delete p;
p = q;
}
cout << "删除完成" << endl;
len = 0;
}
int main()
{
linklist<int> a;
for (int i = 1;i <= 10;i++) //先创建链表123456789 10
{
a.insert_end(i);
}
a.print();
a.insert_pos(999, 5);a.print(); //在第5个元素后面插入一个元素999
a.insert_pos(999, 11); a.print(); //在第11个元素后面插入一个元素999
a.delete_pos(5);a.print(); //删除第5个元素
a.insert_end(20);a.print(); //在末尾插入一个元素20
a.delete_pos(12);a.print(); //删除第12个元素
a.insert_end(200);a.print(); //在末尾插入一个元素200
a.insert_end(201);a.print(); //在末尾插入一个元素201
a.delete_pos(12);a.print(); //删除第12个元素
a.insert_end(200);a.print(); //在末尾插入一个元素200
a.delete_pos(1);a.print(); //删除第1个元素
a.delete_pos(1);a.print(); //删除第1个元素
getchar();
a.destory();
getchar();
return 0;
}主函数是用来测试之用。下图是运行结果。
之后会用链表实现更多的功能,类里面会添加更多方法。
相关文章推荐
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 树的基本结构,以及利用链表实现树的各项操作(创建、添加/删除/打印树节点、销毁等等)
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 单链表基本操作的实现--创建、插入、查找、删除
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 单链表基本操作:创建、插入、删除、获取
- C语言实现双链表基本操作(创建、查找、插入、删除)
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- Java实现单链表插入删除等基本操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)