目录
单链表的基本操作
1.定义单链表结点类型
2.头插法建立单链表
3.尾插法建立单链表
4.按序号查找结点
5.按值查找元素
6.在第i的位置上插入e
7.删除第i位置上的节点
8.求单链表的长度
9.打印单链表的值
10.主函数
以下内容中都是int型为例
typedef struct Lnode {
int data; //数据域
struct Lnode* next; //指针域
}LNode, *Linklist;
先建立头结点,将元素依次插入到头结点的后面
Linklist List_HeadInsert(Linklist& L) {
//创建头结点
L = new LNode();
L->next = nullptr;
LNode* s;
for (int i = 0; i < 5; i++)
{
//头插法
s = new LNode();
s->data = i;
s->next = L->next;
L->next = s;
}
return L;
}
先建立头结点,再建立一个结点 r 记录单链表最后一个结点,初始时指向头结点;在结尾每插入一个结点 更新 一次 r 为最后一个结点。
Linklist List_TailInsert(Linklist& L) {
//创建头结点
L = new LNode();
L->next = nullptr;
LNode* s;
//r为表尾指针
LNode* r = L;
for (int i = 0; i < 5; i++)
{
//尾插法
s = new LNode();
s->data = i;
r->next = s;
r = s;
}
r->next = nullptr; //尾节点指针置空
return L;
}
在单链表的第一个结点开始,按指针next逐个查找,直到第i个位置。(需要判断i的位置)。
LNode* GetElem(Linklist L, int i)
{
int j = 1;
LNode* p = L->next;
if (i == 0)
{
return L; //i等于0返回头结点
}
if (i < 0 )
{
return nullptr; //i无效
}
while (p !=nullptr && j < i)
{
p = p->next;
j++;
}
return p;
}
在单链表的第一个结点开始,按指针next逐查找,找到第一个值相同的返回结点。没有相同的结点返回空。
LNode* LocateElem(Linklist L, int e)
{
LNode* p = L->next;
while (p != nullptr && p->data != e)
{
p = p->next;
}
return p; //找到返回节点指针,否则返回空
}
先判断第i个位置的合法性,然后找到第i个位置的前驱,即第i-1个结点,再在后面插入新结点。
bool InsertElem(Linklist& L,int i, int e)
{
//判断i的位置是否合法
if (i <= 0 )
{
return false;
}
//找到第i个位置的前驱
LNode* p = GetElem(L, i - 1);
//如果前驱为空,i不合法
if (p == nullptr)
{
return false;
}
//创建一个节点
LNode* s = new LNode();
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
先判断第i个位置的合法性,然后找到第i个位置的前驱,即第i-1个结点,删除第i个结点。
bool deleteElem(Linklist& L, int i, int& e)
{
//判断i的位置是否合法
if (i <= 0)
{
return false;
}
//找到第i个位置的前驱
LNode* p = GetElem(L, i - 1);
//如果前驱为空,i不合法
if (p == nullptr)
{
return false;
}
//如果第i的位置为空,无需删除,返回false
if (p->next == nullptr)
{
return false;
}
LNode* q = p->next;
e = q->data;
p->next = q->next;
delete q;
q = nullptr;
return true;
}
设置一个计数器变量,从第一个结点开始顺序访问,每访问一个结点,计数器加1,直到访问到最后一个结点为止。
void printNode(Linklist L)
{
LNode* p = L->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void printNode(Linklist L)
{
LNode* p = L->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
根据以上操作进行的简单测试。
int main()
{
//创建单链表
//头插法
Linklist L1;
Linklist List1 = List_HeadInsert(L1);
cout << "L1: ";
printNode(List1);
//尾插法
Linklist L2;
Linklist List2 = List_TailInsert(L2);
cout << "L2: ";
printNode(List2);
//查找单链表L2的第三个元素
LNode *p = GetElem(L2, 3);
cout << "L2的第三个元素值为:" << p->data << endl;
//找到单链表L2值为3的结点
p = LocateElem(L2, 3);
cout << "p的值为:" << p->data << endl;
//在单链表L2的第2 个位置插入8
if (InsertElem(L2, 2, 8))
{
cout << "插入成功!L2: ";
printNode(List2);
}
else {
cout << "插入失败!" << endl;
}
//求单链表L2的长度
int tmp = LinkLIstLength(L2);
cout << "L2的长度为:" << tmp << endl;
//删除单链表L2的第四个元素
int e;
if (deleteElem(L2, 4, e))
{
cout << "删除成功!L2: ";
printNode(List2);
cout << "删除元素的值为:" << e << endl;
}
else {
cout << "删除失败!" << endl;
}
//求单链表L2的长度
tmp = LinkLIstLength(L2);
cout << "L2的长度为:" << tmp << endl;
}