小编的理解:链表 = 结点+指针
结点:数据域data + 尾指针next
将结点封装在链表中,链表拥有自己的数据成员length,header头结点(注意不是首元结点)
链表特点
1.
它是一种
动态结构
2.
不需预先分配
空间,整个存储空间为多个链表
充分
利用
3.
指针占用
额外
存储空间
4.
不易
随机存取
,低性能查找,高性能增删
单链表整体代码:
#include<iostream>
using namespace std;
template<typename ElemType>
struct Node {
ElemType data;
Node* next= NULL;
Node(){}
Node(ElemType e) {
data = e;
}
};
template<typename ElemType>
struct Linklist {
typedef Node<ElemType>Node;
int length=0;
Node header; // 是一个头节点,不是指针
~Linklist() {
length = 0;
header.next = NULL;
cout << "析构单链表完毕!" << endl;
}
void Insert(ElemType e) {
//头插法
Node* p = new Node(e);
p->next = header.next; // 接尾巴
header.next = p; // 找头
length++;
}
void TailInSert(ElemType e) {
//尾插法
Node* s = &header;
Node* p = new Node(e);
while (s->next!=NULL) {
s = s->next;
}
//s 指针移动到最后一个结点
p->next = s->next; // 尾部插入,接尾巴
s->next = p; // 找头部
s = p; // s 指针移动到最后
length++;
}
void Delete(ElemType e) {
//删除指定元素
Node* p = header.next;
while (p) {
if (p->next->data == e) {
Node* q = p->next;
p->next = q->next; // 跳过它
cout << "成功删除元素" << e << endl;
return;
}
p = p->next;
if (p->next == NULL) {
break;
}
}
cout << "抱歉,没有此元素" << e << ",所以无法删除" << endl;
}
void serch(ElemType e) {
Node* p = header.next;
int n = 0;
while (p) {
if (p->data == e) {
cout << "找到" << e ;
n++;
}
p = p->next;
}
if (n == 0)cout << "没找到" <<e<< endl;
else cout << ",查找完毕" << endl;
}
void output() {
Node* p = header.next;
cout << "header ->";
while (p) {
cout << p->data << " ->";
p = p->next;
}
cout << "end";
cout << endl;
}
};
int main() {
Linklist<int> L;
L.TailInSert(3);
L.TailInSert(4);
L.TailInSert(5);
L.TailInSert(6);
L.TailInSert(7);
L.output();
L.Delete(4);
L.output();
L.Delete(9);
L.serch(5);
L.serch(8);
L.Insert(35);
L.output();
return 0;
}
输出结果:
header ->3 ->4 ->5 ->6 ->7 ->end
成功删除元素4
header ->3 ->5 ->6 ->7 ->end
抱歉,没有此元素9,所以无法删除
找到5,查找完毕
没找到8
header ->35 ->3 ->5 ->6 ->7 ->end
析构单链表完毕!