单链表

在这里插入图片描述
在这里插入图片描述
通过指针把它的一串存储结点链接成一个链
存储结点由两部分组成:
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;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值