#include<iostream>
using namespace std;
template <class T>
class node
{
public:
int data;
node<T>* next;
};
template <class T>
class linklist
{
public:
linklist();
linklist(T a[], int n);
linklist(int n, T a[]);
~linklist();
int length();
T Get(int i);
void Set(int i, T x);
int Locate(T x);
void Insert(T x, int i);
T Delete(int i);
void Printlinklist();
node<T>* GetFirst();
void Reversekinklist();
private:
node<T>* first;
};
template<class T>
linklist<T>::linklist()
{
node<T> first = new node<T>;
first->next = nullptr;
}
//template<class T>
//linklist<T>::linklist(T a[], int n)
//{
// first = new node<T>;
// node<T>* s;
// first->next = nullptr;
// for (int i = 0; i < n; i++)
// {
// s = new node<T>;
// s->data = a[i];
// s->next = first->next;
// first->next = s;
// }
//}
template<class T>
linklist<T>::linklist(T a[], int n)
//有序单链表构造函数
{
first = new node<T>;
first->next = nullptr;
node<T>* p, * q, * s;
for (int i = 0; i < n; i++)
{
q = first;
p = first->next;
s = new node<T>;
s->data = a[i];
while (p && p->data <= a[i])
{
q = p;
p = p->next;
}
s->next = q->next;
q->next = s;
}
}
template<class T>
linklist<T>::linklist(int n, T a[])
{
first = new node<T>;
first->next = nullptr;
node<T>* s, * r = first;
for (int i = 0; i < n; i++)
{
s = new node<T>;
s->data = a[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
template<class T>
linklist<T>::~linklist()
{
node<T>* q, * p = first;
while (p)
{
q = p;
p = p->next;
delete q;
}
}
template<class T>
int linklist<T>::length()
{
int p = first->next;
int j = 1;
while (p)
{
j++;
p = p->next;
}
return j;
}
template<class T>
T linklist<T>::Get(int i)
{
node<T>* p = first->next;
int j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p)
throw"位置error";
else
return p->data;
}
template<class T>
void linklist<T>::Set(int i, T x)
{
int p = first->next;
int j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p)
throw"位置error";
else
p->data = x;
}
template<class T>
int linklist<T>::Locate(T x)
{
int p = first->next;
int j = 1;
while (p && x != p->data)
{
p = p->next;
j++;
}
if (!p)
return -1;
else
return j;
return 0;
}
template<class T>
void linklist<T>::Insert(T x, int i)
{
node<T>* p = first->next;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p)
throw"位置错误";
else
{
node<T>* s = new node<T>;
s->data = x;
s->next = p->next;
p->next = s;
}
}
template<class T>
T linklist<T>::Delete(int i)
{
int p = first, j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p || !p->next)
throw"位置错误";
else
{
int q = p->next;
int x = q->data;
p->next = q->next;
delete q;
return x;
}
}
template<class T>
void linklist<T>::Printlinklist()
{
node<T>* p = first->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
}
template<class T>
node<T>* linklist<T>::GetFirst()
{
return first;
}
template<class T>
void linklist<T>::Reversekinklist()
{
node<T>* p, * q;
p = first->next;
first->next = nullptr;
while (p)
{
q = p;
p = p->next;
q->next = first->next;
first->next = q;
}
}
template <class T>
void Merge(linklist<T>la, linklist<T>lb, linklist<T>& lc)
{
node<T>* pa, * pb, * s, * r;
pa = la.GetFirst();
pa = pa->next;
pb = lb.GetFirst;
pb = pb->next;
r = lc.GetFirst();
r ->next=nullptr;
while (pa && pb)
{
if (pa->data <= pb->data)
{
s = new node<T>;
s->data = pa->data;
r->next = s;
pa = pa->next;
}
else
{
s = new node<T>;
s->data = pb->data;
r->next = s;
pb = pb->next;
}
r = s;
}
while (pa)
{
s = new node<T>;
s->data = pa->data;
r->next = s;
pa = pa->next;
r = s;
}
while (pb)
{
s = new node<T>;
s->data = pa->data;
r->next = s;
pb = pb->next;
r = s;
}
r->next = 0;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
linklist<int>b(10, a);
b.Printlinklist();
b.Reversekinklist();
cout << endl;
b.Printlinklist();
b.Insert(2, 3);
cout << endl;
b.Printlinklist();
return 0;
}
单链表代码
于 2022-03-30 15:22:10 首次发布