线性表
链表
- 通过指针把它的一串存储结点链接成一个链
- 存储结点有两个部分组成:
— 数据域+指针域(后继地址) data next
分类(根据链接方式和指针多寡)
单链表
简单的单链表
— 整个单链表:head — 第一个结点:head — 空表判断: head==NULL — 当前结点a : curr
带头结点的单链表
- 整个单链表:head
- 第一个结点:head->next,head!=NULL
- 空表判断:head->next=NULL
- 当前结点a:fence->next(curr隐含)
单链表的结点类型
template<class T>
class Link {
public:
T data;
Link<T>* next;
Link(const T info, const Link<T>* nextValue = NULL) {
data = info;
next = nextValue;
}
Link(const Link<T>* nextValue) {
next = nextValue;
}
};
单链表类定义
template<class T>
class LinkList :public List<T> {
private:
Link<T>* head, * tail;
Link<T>* setPos(const int k);
public:
LinkList(int s);
~LinkList();
bool IsEmpty();
bool Clear();
int Length();
bool Append(const T value);
bool Insert(const int k, const T value);
bool Delete(const int k);
bool GetValue(const int k, T& value);
bool GetPos(int& k, const T value);
};
查找单链表中第i个结点
template<class T>
Link<T>* LinkList<T>::setPos(int i) {
int count = 0;
if (i == -1) {
return head;
}
Link<T>* k = head->next;
while (k != NULL && count < i) {
k = k->next;
count++;
}
return k;
}
单链表的插入
template<class T>
bool LinkList<T>::Insert(const int i, const T value) {
Link<T>* p, * q;
if ((p = setPos(i - 1)) == NULL) {
cout << "非法插入点" << endl;
return false;
}
q = new Link<T>(value, p->next);
p->next = q;
if (p == tail) {
tail = q;
}
return false;
}
单链表的删除
- 从链表中删除结点x
— 用p指向元素x的结点的前驱结点 — 删除元素为x的结点 — 释放x占据的空间
|