#include <iostream>
using namespace std;
template<class T>
class LinkNode {//结点类
template <class T>
friend class LinkList;//将链式表类声明为友类
public:
LinkNode() { next = NULL; }//构造函数
private:
T data;
LinkNode<T> *next;//指向下一节点的指针
};
template <class T>
class LinkList {
public:
LinkList();
~LinkList();
LinkList<T>& Insert(int k, const T& x);//插入和删除的写法,记住
bool isEmpty() const;
int GetLength() const;
bool GetData(int k, T& x);
bool ModifyData(int k, const T& x);
int Find(const T& x);
LinkList<T>& DeleteByIndex(int k, T& x);
LinkList<T>& DeleteByKey(const T& x, T& y);
void Output(ostream& out);
private:
LinkNode<T> *head;//指向链表的第一个头节点的指针
};
template<class T>
LinkList<T>::LinkList()
{
head = new LinkNode<T>();
}
template<class T>
LinkList<T>::~LinkList()
{
T x;
int len = GetLength();
for (int i = len; i >= 1; i--)
DeleteByIndex(i, x);
delete head;
}
template<class T>
LinkList<T>& LinkList<T>::Insert(int k, const T& x)
{
LinkNode<T> *p = head;//p指向头结点
LinkNode<T>* newNode = new LinkNode<T>;//创建待插入的新结点
newNode->data = x;
int len = GetLength();
if (k<1 || k>len + 1)
cout << "失败";
else {
for (int i = 1; i < k; i++)
p = p->next;
newNode -> next = p->next;//在k处插入新结点
p->next = newNode;
}
return *this;
}
template<class T>
bool LinkList<T>::isEmpty() const
{
return head->next==NULL;
}
template<class T>
int LinkList<T>::GetLength() const
{
int length = 0;
LinkNode<T>* p = head->next;
while (p) {
length++;
p = p->next;
}
return length;
}
template<class T>
bool LinkList<T>::GetData(int k, T& x)
{
LinkNode<T>* p = head->next;
int index = 1;
if (k<1 || k>GetLength())
return false;
while (p != NULL && index < k) {
index++;
p = p->next;
}
if (p == NULL)
return false;
else {
x = p->data;
return true;
}
}
template<class T>
bool LinkList<T>::ModifyData(int k, const T& x)
{
LinkNode<T>* p = head->next;
int index = 1;
if (k<1 || k>GetLength())
return false;
while (p != NULL && index < k) {
index++;
p = p->next;
}
if (p == NULL)
return false;
else {
p->data = x;
return true;
}
}
template<class T>
int LinkList<T>::Find(const T& x)
{
LinkNode<T>* p = head->next;
int index = 1;
while (p != NULL && p->data!=x) {
p = p->next;
index++;
}
if (p != NULL)
return index;
else
return 0;
}
template<class T>
LinkList<T>& LinkList<T>::DeleteByIndex(int k, T& x)
{
if (GetData(k, x)) {
LinkNode<T>* p = head;
LinkNode<T>* q = NULL;
for (int i = 1; i < k; i++)//移动到第k-1位置
p = p->next;
q = p->next;
p->next = q->next;
delete q;
}
else
cout << "失败";
return *this;
}
template<class T>
LinkList<T>& LinkList<T>::DeleteByKey(const T& x, T& y)
{
int index = Find(x);
if (index != 0) {
return DeleteByIndex(index, y);
}
else {
cout << "失败";
return *this;
}
}
template<class T>
void LinkList<T>::Output(ostream& out)
{
LinkNode<T>* p = head->next;
while (p != NULL) {
out << p->data << endl;
p = p->next;
}
}
template<class T>
ostream& operator<<(ostream& out, LinkList<T>& x) {
x.Output(out);
return out;
}
int main() {
LinkList<int> list;
int x, y;
list.Insert(1, 100);
list.Insert(2, 200);
list.Insert(3, 300);
cout << "长度为:" << list.GetLength() << endl;
if (list.GetData(3, x))
cout << "第3个元素为" << x << endl;
x = 200;
cout << list.Find(x) << endl;
x = 150;
list.ModifyData(2, x);
cout << list;
return 0;
}
C++之链表
最新推荐文章于 2025-04-04 19:20:06 发布