链表
作者:互联网
目录
一 链表原理
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,那么 怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位 置。如图所示:
从图中可以看出,每个结点包含两个域:数据域和指针域,指针域存储下一个结点的地址, 因此指针指向的类型也是结点类型
链表的核心要素:
1.节点由数据域和指针域组成
2.指针域指向下一个节点的内存地址
其结构体定义:
Typedef struct LinkNode
{
ElemType data;
struct LinkNode *next;
}LinkList, LinkNode; // 首结点:LinkList 结点:LinkNode
二 单链表的算法实现
单链表的概念:链表的节点均单向指向下一个节点,形成一条单向访问的数据链
2.1 单链表的初始化
typedef struct _LinkNode
{
int data; // 结点的数据域
struct _LinkNode* next; // 结点的指针域
}LinkNode, LinkList;
bool initList(LinkList* &list)
{
list = new LinkNode;
if (!list) // 生成结点失败
{
return false;
}
list->next = NULL;
return true;
}
2.2 单链表插入元素
1.前插法:
// 前插法
bool listInsertFront(LinkList*& list, LinkNode* node)
{
if (!list || !node)
{
return false;
}
node->next = list->next; // 新插入结点的指针域 = 头结点的指针域
list->next = node; // 头结点的指针域 = 新插入的结点
return true;
}
2.尾插法
// 尾插法
bool listInsertBack(LinkList*& list, LinkNode* node)
{
if (!list || !node)
{
return false;
}
LinkNode* last = new LinkNode;
last = list;
// 判断last是否是最后一个元素
while (last->next)
{
last = last->next;
}
// 是最后一个元素,把last的next指向新添加的元素
last->next = node;
node->next = NULL;
return true;
}
3.指定位置插入
// 指定位置插入
bool listInsert(LinkList*& list, int subscript, int& elem)
{
if (!list)
{
return false;
}
int i = 0;
LinkNode* p = list; // p表示当前正在检查的结点
LinkNode* s = new LinkNode; // s表示需要插入的结点
while (p && i < subscript -1) // 找到 subscript-1 的位置,p指向该结点
{
p = p->next;
i++;
}
if (!p || i > subscript - 1) // 如果插入的位置大于当前链表中的总元素,要判断!p 如果subscript是负数,要判断i > subscript - 1
{
return false;
}
// 找到要插入的位置
s->data = elem;
s->next = p->next;
p->next = s;
return true;
}
2.3 单链表查找
标签:结点,单链,return,list,next,链表,LinkNode 来源: https://www.cnblogs.com/hn1477856/p/16323209.html