最近复习数据结构,既是为了找工作,也是提升内功的一个必经之路。
1.单链表:
(1) 定义:
template <typename T>
strcut Node
{
T data;
sturct Node* next;
};
(2)构造:
template <typename T>
LinkList<T>::LinkList(T a[], int n) //头插法建立单链表
{
Node<T>* front = new Node<T>;
front->next = NULL;
for(int i = n - 1; i >= 0; i--)
{
Node<T>* s = new Node<T>;
s->data = a[i];
s->next = front->next;
front->next = s;
}
}
template <typename T>
LinkList<T>::LinkList(T a[], int n) //尾插法建立单链表
{
Node<T>* front = new Node<T>;
Node<T>* rear = new Node<T>;
for (int i = 0; i < n; i++)
{
Node<T>* s = new Node<T>;
s->data = a[i];
rear->next = s;
rear = s;
}
rear->next = NULL;
}
(3)析构:
template <typename T>
LinkList<T>::~LinkList()
{
Node<T>* p = front;
while(p)
{
front = p;
p = p->next;
delete front;
}
}
(4)查找:
template <typename T>
T* ListLink<T>::Get(int i) //按位查找
{
Node<T>* p = front->next;
while(p && j != i)
{
p = p->next;
++j;
}
if (!p)
throw "wrong";
else
return p->data;
}
template <typename T>
int ListLink<T>::Locate(T value) //按值查找
{
Node<T>* p = front->next;
int j = 1;
while(p)
{
if(p->data == value)
return j
p = p->next;
++j;
}
return -1;
}
(5)插入:
template <typename T>
void ListLink<T>::Insert(int i, T value) //在第i个位置上插入值为value的新元素
{
Node<T>* p = front;
if(i != 1)
p = Get(i-1);
if (p)
{
Node<T>* s = new Node<T>;
s->data = value;
s->next = p->next;
p->next = s;
}
else
throw "wrong";
}
有前插、后插以及O(1)的改进前插操作
(6)删除:
template <typename T>
T ListLink<T>::DeleteNode(int i) //删除第i个元素,并将该元素返回
{
Node<T>* p = front;
if(i != 1)
p = Get(i-1);
Node<T>* q = p->next;
p->next = q->next;
T value = q->data;
delete q;
return value;
}