单链表实现(c++)
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int N = 110;
template <typename T>
struct node
{
T data;
node<T> *next;
};
template <typename T>
class linklist
{
node<T> *first;
public:
linklist();
linklist(T a[], int n);
~linklist();
int length();
int getn(T num);
T getp(int pos);
T del(int pos);
void insert(int pos, T num);
void display();
};
template <typename T>
linklist<T>::linklist()
{
first = new node<T>;
first->next = nullptr;
}
template <typename T>
linklist<T>::linklist(T a[],int n)
{
first = new node<T>;
node<T> *r = first;
node<T> *s = nullptr;
for(int i = 1; i <= n; i++)
{
s = new node<T>;
s->data = a[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
template <typename T>
linklist<T>::~linklist()
{
node<T> *p = first;
while(first != nullptr)
{
first = first->next;
delete p;
p = first;
}
}
template <typename T>
int linklist<T>::length()
{
node<T> *p = first->next;
int cnt = 1;
while(p != nullptr)
{
p = p->next;
cnt++;
}
cnt--;
return cnt;
}
template <typename T>
int linklist<T>::getn(T num)
{
node<T> *p = first->next;
int cnt = 1;
while(p != nullptr)
{
if(p->data == num)
return cnt;
p = p->next;
cnt++;
}
if(p == nullptr)
throw "查找值错误";
}
template <typename T>
T linklist<T>::getp(int pos)
{
node<T> *p = first->next;
int cnt = 1;
while(p != nullptr && cnt <= pos - 1)
{
p = p->next;
cnt++;
}
if(p == nullptr)
throw "查找位置错误";
else
return p->data;
}
template <typename T>
T linklist<T>::del(int pos)
{
node<T> *p = first->next;
node<T> *q = nullptr;
T x;
int cnt = 1; 计数器;
while(p != nullptr && cnt < pos - 1)
{
p = p->next;
cnt++;
}
if(p == nullptr)
throw "删除位置错误";
else
{
q = p->next;
x = q->data;
p->next = q->next;
delete q;
return x;
}
}
template <typename T>
void linklist<T>::insert(int pos, T num)
{
node<T> *p = first->next;
node<T> *s = nullptr;
int cnt = 1;
while(p != nullptr && cnt < pos - 1)
{
p = p->next;
cnt++;
}
if(p == nullptr || p->next == nullptr)
throw "插入位置错误";
else
{
s = new node<T>;
s->data = num;
s->next = p->next;
p->next = s;
}
}
template <typename T>
void linklist<T>::display()
{
node<T> *p = first->next;
while(p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
}
int main()
{
int a[N];
memset(a,0,sizeof(a));
for(int i = 1; i <= 5; i++)
a[i] = i;
linklist<int> A(a,5);
cout << A.length() << endl;
cout << A.getp(3) << endl;
cout << A.getn(5) << endl;
cout << A.del(5) << endl;;
A.insert(4,111);
A.display();
return 0;
}