链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,那么 怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位 置。如图所示:
从图中可以看出,每个结点包含两个域:数据域和指针域,指针域存储下一个结点的地址, 因此指针指向的类型也是结点类型
链表的核心要素:
每个节点由数据域和指针域组成
指针域指向下一个节点的内存地址
链表的定义
struct LinkNode
{
ElemType data;//要存放的数据
LinkNode*next;//指向下一个结构体的指针
};
链表的初始化
bool Inti_LinkNode(LinkNode*& L)
{
L = new LinkNode;
if (!L)
return false;
L->next = NULL;
return true;
}
头插法
bool ListInsert_front(LinkList*&L,LinkNode*node)
{
if(!L||!node)
return flase;
node->next=L->next;
L->next=node;
return true;
}
尾插法
bool Insert_Link_back(LinkNode* L, LinkNode* node)
{
if(!L||!node)
return false;
LinkNode* p = L;
while (p->next)
p = p->next;
node->next = NULL;
p->next = node;
return true;
}
指定位置插入
bool Insert_Link(LinkNode* L, int i, LinkNode* node) { LinkNode* p = L->next; int j; for (j = 0; j < i-1; j++) { if (!p) return false; p = p->next; } node->next = p->next; p->next = node; return true; }
获取指定元素
bool Link_GetElem(LinkNode*& L, int i, int& e) { if (!L) return false; LinkNode* p = L->next; int j; for (j = 0; j < i - 1; j++) { if (!p) return false; p = p->next; } e = p->data; return true; }