通过指针把它的一串存储结点链接成一个链
存储结点由两部分组成:
data字段
link字段
链表结点数据类型的定义
在C++中,可以用结构类型来描述单链表的结点 ,由于结点的元素类型不确定,所以采用C++的模板机制。
template
struct Node
{
T data;
Node *next; //此处也可以省略
}
带头节点的单链表
头结点:如果链表有头节点,则链式结构中的第一个节点称为头结点:其数据域可以存储一些附加信息,如链表长度;其指针域指向链表中的第一个节点。
头插法构造函数
Linklist(T a[], int n) // 头插法
{
first = new Node;
first->next = NULL;
Node* s;
for (int i = 0; i < n; ++i)
{
s = new Node;
s->data = a[i];
s->next = first->next; // 新插入的s结点的后继为原先first结点的后继
first->next = s; // first结点的后继更新为s
}
}
尾插法构造函数
Linklist(int n, T a[]) // 尾插法
{
first = new Node;
Node* s;
Node* r; // 为方便实现,定义一个尾结点
r = first;
for (int i = 0; i < n; ++i)
{
s = new Node;
s->data = a[i];
r->next = s; // 每次在插入时都会把新的结点插入到尾结点的后继中
r = s; // 更新尾结点为最新的s结点,保证最后一个是尾结点
}
r->next = NULL; // 所有插入完成后,尾结点的后继为NULL
}
单链表的遍历
void Printlist()
{
Node* p;
p = first->next;
while (p != NULL) // p不为NULL为条件,否则指针异常
{
cout << p->data << endl;
p = p->next;
}
}
单链表中按位置查找
T getData(int i)
{
Node* p;
p = first->next;
int x = 1;
while (p != NULL && x < i)
{
p = p->next;
x++;
}
if (p == NULL)throw"位置"; // 如果错误范围异常
else
return p->data;
}
单链表的删除操作
T Delete(int i)
{
Node* p;
int count = 0;
p = first;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL)throw"位置";
else
{
Node* q;
T x;
q = p->next;
x = q->data;
p->next = q->next; // 链表删除后,要重新定向删除删除节点的上一个结点的后继
delete q;
return x;
}
return 0;
}
析构函数
~Linklist()
{
Node* q;
while (first != NULL)
{
q = first->next;
delete first;
first = q;
}
}