链式储存简介
相比于顺序储存,链式储存的增删改查处理更加方便。因为链式储存的储存空间不一定连续,因此一个节点的改动对其他结点较小。
相关操作
创立结点类型
template<typename T>
//构造结点类型
struct LinkNode{
T data;
LinkNode<T>* next;
LinkNode(T d)::data(d), next(NULL);//初始化结点
LinkNode()::next(NULL);//没有输入值时的结点构造
};
创建链表类型
//创立链表类型
template<typename T>
class LinkList {
public:
LinkNode<T>* head;//头结点
void CreateListF(T a[], int n);
void CreateListR(T a[], int n);
bool *Findi(int i);
LinkList<T>();
void Add(T e);
int GetLength();
bool GetElem(int i,T e);
bool SetElem(T e,int i);
int GetNo(T e);
bool Insert(int i, T e);
bool Delete(int i);
void DispList();
~Linklist<T>();
};
头插法建立链表
template<typename T>
void LinkList<T>::CreateListF(T a[], int n) {
for (int i = 0; i < n; i++) {
LinkNode<T>* s = new LinkNode<T>(a[i]);
s->next = head->next;
head->next = s;
}
}
尾插法建立链表
void LinkList<T>::CreateListR(T a[], int n) {
LinkNode<T>* s, * r;
r = head;
for (int i = 0; i < n; i++) {
s = new LinkNode<T>(a[i]);
r->next = s;//s插入到s后面
r = s;//r结点储存s的信息
}
r->next = NULL;//改写成最后一个结点
}
查找编号为i的结点
template<typename T>
bool LinkList<T>::*Findi(int i) {
LinkNode<T>* p;
p = head;
if (i < -1)
return NULL;
int j = -1;
while (j < i && p != NULL) {
j++;
p = p->next;
}
return p;
}
创建空单链表
LinkList<T>::LinkList() {
head = new LinkNode<T>();
}
析构函数
template<typename T>
LinkList<T>::LinkList() {
LinkNode<T>* pre, * p;
pre = head;
p = pre->next;
while (p != NULL) {
delete pre;
pre = p;
p = p->next;
}
delete pre;
}
添加结点
template<typename T>
void LinkList<T> ::Add(T e) {
LinkNode<T>* s = new LinkNode<T>;
s->data = e;
LinkNode<T>* p;
p = head;
while (p != NULL) {
p = p->next;
}
p->next = s;
}
求单链表的长度
template<typename T>
int LinkList<T>::GetLength() {
int i = 0;
LinkNode<T>* s;
s = head;
while (s != NULL) {
s = s->next;
i++;
}
return i;
}
求序号为i的结点值
template<typename T>
bool LinkList<T>::GetElem(int i,T e) {
LinkNode<T>* p;
if (i < -1) return 0;
p = Findi(i);
if (p != NULL) {
e = p->data;
return 1;
}
else return 0;
}
设置序号为i处的结点值
template<typename T>
bool LinkList<T>::SetElem(T e,int i) {
if (i < -1) return 0;
if (i >= -1) {
LinkNode<T>* p;
p = Findi(i);
if (p != NULL) {
p->data = e;
return 1;
}
}
return 0;
}
查找第一个为e的元素的序号
template<typename T>
int LinkList<T>::GetNo(T e) {
LinkNode<T>* p;
p = head;
int j = -1;
while (p != NULL) {
if (p->data = e) {
return j;
}
j++;
p = p->next;
}
return -1;
}
在单链表中序号为i的位置插入值为e的结点
template<typename T>
bool LinkList<T>::Insert(int i, T e) {
if (i < 0) return 0;
if (p != NULL) {
LinkNode<T>* p, * r;
r = Findi(i);
p = new LinkNode<T>;
p->data = e;
p->next = r->next;
r->next = p;
return 1;
}
else
return 0;
}
删除位置序号为i位置
bool LinkList<T>::Delete(int i) {
LinkNode<T>* p, * q;
if (i < 0) return 0;
if (p != NULL) {
p = Findi(i - 1);
if (q != NULL) {
q = p->next;
p->next = q->next;
delete q;
return 1;
}
else return 0;
}
else
return 0;
}
展示函数
template<typename T>
void LinkList<T>::DispList() {
LinkNode<T>* p = new LinkNode<T>;
p = head;
int i = -1;
while (p != NULL) {
cout << p->data << " ";
i++;
}
delete p;
}