带头节点单链表的增,删,改,查
前言
头插法,尾插法实现带头结点的单链表,以及按值查找,并返回所有符合条件的结点个数
提示:以下是本篇文章正文内容,下面案例可供参考
代码实现
代码如下(示例):
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode* next;
}LNode,*LinkList;
//链表初始化
bool InitList(LinkList& L)
{
L = new LNode;
if (L == NULL)
return false;
L->data = 0;
L->next = NULL;
return true;
}
//尾插法建立带头结点的单链表
LinkList TailInsert(LinkList& L,int len)
{
LNode* s, * r = L;
for (int i = 0; i < len; i++)
{
s = new LNode;
int x;
cin >> x;
s->data = x;
s->next = NULL;
r->next = s;
r = s;
}
return L;
}
//头插法建立带头结点的单链表
LinkList HeadInsert(LinkList& L, int len)
{
LNode* s;
for (int i = 0; i < len; i++)
{
int x;
s = new LNode;
s->next = NULL;
cin >> x;
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
//打印链表具体信息
void PrintList(const LinkList L)
{
int count = 1;
LNode* ret = L->next;
while (ret)
{
cout << ret->data << " ";
ret = ret->next;
count++;
}
cout << "\n连同头节点,共有" << count << "个结点\n" << endl;
}
//单链表按值删除某个结点
LNode DelByVal(LinkList& L, int x)
{
LNode* temp = NULL, * flag = L;
int count = 0;
while (flag->next!=NULL)
{
if (flag->next->data==x)
{
temp = flag->next;
flag->next = temp->next;
flag = L;
count++;
}
flag = flag->next;
}
cout << "共删除了" << count << "个数据域为" << x << "的结点" << endl;
cout << "当前链表信息为:";
PrintList(L);
return *temp;
}
//按值查找
LNode* SearchByVal(const LinkList L, int x)
{
LNode* temp = NULL, * flag = L->next;
int count = 0;
while (flag)
{
if (flag->data == x)
{
count++;
temp = flag;
}
flag = flag->next;
}
cout << "共存在" << count << "个数据域为" << x << "的结点" << endl;
//若想定位该包含该数据的第一个结点所在位置,则需要再写一个循环,相对来说有一定的开销,且逻辑结构简单,在此就不展示了,感兴趣的可以自己动手实操一下
return temp;
}
int main()
{
LinkList L1,L2;
InitList(L1);
InitList(L2);
bool ret1 = LinkList(L1);
bool ret2 = LinkList(L1);
if (ret1 && L2)
cout << "链表L1和L2初始化成功!" << endl;
else
cout << "链表初始化失败!" << endl;
cout << "尾插法简历链表";
TailInsert(L1, 5);
cout << "尾插法完成后,链表信息展示" << endl;
PrintList(L1);
cout << "头插法简历链表";
HeadInsert(L2, 5);
cout << "头插法完成后,链表信息展示" << endl;
PrintList(L2);
LNode temp = DelByVal(L1, 3);
SearchByVal(L2, 2);
cout << "所删除结点的数据域为" << temp.data << endl;
return 0;
}
2.输入数据及结果展示
结果如下(示例):
总结
提示:多动脑,多思考吧,反正很长时间没写,感觉脑子都生锈了