概述
链表是数据结构中线性表的一种,和顺序表不同,其在内存中的数据是非连续存储的。
数组和顺序表是顺序存储的,也就是内存是连续的;而链表是通过指针将不连续的内存连接起来,实现链式储存的。
链表特点:
1.没有固定的长度,可以自由增加节点
2.能够实现快速的插入删除数据
3.尾节点的后继必定指向空
代码实现
一、单链表的存储结构
//节点数据结构
struct Node
{
int data;
Node *next;
};
//单链表数据结构
typedef struct
{
int len;//链表长
Node *pHead;//头节点
}LinkList;
二、单链表的构建
//---构造空链表L---
bool InitList(LinkList *L)
{ //1.动态开辟辅助节点
Node *p = (Node *)malloc(sizeof(Node));
p->next = nullptr;
p->data =0;
//2.动态开辟辅助链表
LinkList *l = (LinkList*)malloc(sizeof(LinkList));
l->pHead = p;//头指针指向头节点
l->len =0;
//3.将辅助链表拷贝到原链表
*L = *l;
return true;
}
三、单链表的插入
//---在单链表第n个位置之前插入m---
bool Insert(LinkList *L,int n,int m)
{
//1.插入位置不在范围内
if (n<1 || n>L->len+1)
return false;
//2.在头节点前插入
if (n == 1)
{
Node *p = L->pHead;//辅助节点
//动态开辟插入节点
Node *pThis = (Node *)malloc(sizeof(Node));
pThis->next = p;
pThis->data = m;
L->pHead = pThis;
L->len++;
return true;
}
//3.开始插入
Node *p = L->pHead;//辅助节点
for (int i = 1; i < n-1; i++)
{
p = p->next;//寻找插入位置
}
//动态开辟插入节点
Node *pThis = (Node *)malloc(sizeof(Node));
pThis->next = p->next;
pThis->data = m;
p->next = pThis;
L->len++;
return true;
}
四、单链表的删除
//---将单链表第n个位置的数删除---
bool Delete(LinkList *L,int n)
{
//1.链表为空
if (L->len == 0)
return false;
//2.删除位置不在范围内
if (n<1 || n>L->len)
return false;
//3.删除头节点
if (n == 1)
{
Node *p = L->pHead;//辅助节点
L->pHead = p->next;
L->len--;
delete [] p;//释放辅助节点
return true;
}
//4.开始删除
Node *p = L->pHead;//辅助节点
for (int i = 1; i < n-1; i++)
{
p = p->next;//寻找删除位置
}
Node *pThis = p->next;//删除节点
p->next = pThis->next;
L->len--;
delete [] pThis;//释放删除节点
return true;
}
五、清空单链表
//---将单链表清空---
bool Clear(LinkList *L)
{
Node *pThis = L->pHead->next;//辅助节点
Node *p;//清除节点
while (pThis)
{
L->pHead->next = pThis->next;
p = pThis;
pThis = pThis->next;
delete [] p;//释放清除节点
}
L->pHead->next = nullptr;
L->len = 0;
return true;
}
六、遍历单链表
//---将单链表遍历---
void OutPut(LinkList *L)
{
printf("链表长为%d\n",L->len);
Node *pThis = L->pHead;
for (int i = 0; i < L->len; i++)
{
printf("%d\n",pThis->data);
pThis = pThis->next;
}
}