您的位置:首页 > 其它

链表(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;
}主函数是用来测试之用。下图是运行结果。



之后会用链表实现更多的功能,类里面会添加更多方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  12 21
相关文章推荐