单链表分为带头结点和不带头结点的单链表。本文主要针对带头结点的单链表。
首先是定义一个单链表,需要包括数据部分(data)指向下一个结点的部分(指针)
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * Linklist;
用typedef给struct LNode改名为LNode,以及LNode指针改名为Linklist这样会方便一点。
接着就需要进行实例化一个单链表也就是初始化。
void Initlist(Linklist& L)
{
L = new LNode;
if (L == NULL)
return ;
L->next = NULL;
}
这里其实不管用LNode*还是Linklist都行,只是为了便于区分用Linklist来强调这是一个单链表而LNode*强调是一个指针。
初始化好了之后,开始实现单链表的增删改查等基本功能。
插入元素:
//按位序插入数据e
void Insertlist(Linklist& L, int i, int e)
{
if (i < 1)
return;
LNode* p;
p = L;
int j = 0;//记录当前指向第几个指针,从0开始即头结点,把头结点当作第0个结点
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)//i值不合法,即i-1已经为NULL了
{
cout << "插入位序不合法" << endl;
return;
}
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
cout << "按位序插入数据成功" << endl;
}
//在指定结点后插入数据操作
void InsertNextNode(LNode* p, int e)
{
if (p == NULL) return;
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
cout << "后插数据成功" << endl;
}
//在指定结点前插入数据操作
void InsertFrontNode(LNode * p,int e)
{
if (p == NULL) return;
LNode* s = new LNode;
if (s == NULL) return;
s->data = p->data;
p->data = e;
s->next = p->next;
p->next = s;
cout << "前插数据成功" << endl;
}
删除元素:
//按位序删除
void Deleteloc(Linklist& L,int i)
{
if (i < 1) return;
LNode* p = L;
int j = 0;//当前j指向的第几个结点
if (p != NULL && j < i - 1)//找到第i-1个结点
{
p = p->next;
j++;
}
if (p == NULL)//i值不合法,即i-1已经为NULL了
{
cout << "插入位序不合法" << endl;
return;
}
LNode* q = p->next;//让q指向被删除的结点
int e = q->data;//记录被删除结点的数据
p->next = q->next;//这里不用p->next->next的原因是因为,删除节点从链表断开便于释放
delete q;//释放被删除的结点
q = NULL;//置空,防止野指针
cout << "按位删除成功,删除结点存储的数据为" << e << endl;
}
//删除指定结点
void DeleteNode(LNode* p)
{
if (p == NULL) return;
LNode* q = p->next;
int e = p->data;
p->data = q->data;
p->next = q->next;
delete q;
q = NULL;
cout << "成功删除结点,删除的数据为:" << e << endl;
}
查找元素:
//按值查找
void Selectnum(Linklist L, int e)
{
int cnt = 0;//记录链表中改值的个数
int i = 0;//记录该值在链表中的位置
while (L != NULL)
{
if (L->data == e)
{
cnt++;
cout << e << "在链表中的位序为:" << i << endl;
}
i++;
L = L->next;
}
cout << "数据" << e << "在链表中有" << cnt << "个" << endl;
}
//按位差找
void Selectloc(Linklist L, int i)
{
if (i < 1) return;
LNode* p = L;
int j = 0;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
if (p == NULL) return;
cout << "链表中位序为" << i << "的数据为" << p->data << endl;
}
这就是关于单链表的实现也算是我自己的笔记,可能也会有很多不足之处,希望能帮到有需要的人。