一、创建linklist.h头文件,创建LNode结点,LinkList链表类
#pragma once //防止头文件重复包含
#include<iostream> //标准输入输出流
using namespace std; //标志命名空间
//创建结点
struct LNode
{
int Data; //数据域
LNode* Next; //指针域
};
//创建单链表类
class LinkList
{
public:
//利用构造函数初始化单链表
LinkList();
//显示菜单
void MenuList();
//创建单链表L并使用头插法,插入n个元素
void CreateList_H();
//创建单链表L并使用尾插法,插入n个元素
void CreateList_R();
//在单链表L中第i个元素之前插入数据元素e
void ListInsert();
//将单链表L中第i个数据元素删除
void ListDelete();
//遍历单链表L
void PrintList();
//求单链表的表长
void ListLength();
//判断单链表是否为空
void ListEmpty();
//获取单链表中的某个元素的内容,通过变量e返回
void GetElem();
//在单链表L中查找值为e的数据元素的位置序号
void LocateElem();
//清空单链表
void ClesrList();
//销毁单链表,并退出
void DestroyList();
public:
LNode * L; //头指针,单链表名
};
二、创建linklist.cpp源文件,实现链表类中函数功能的具体实现
#include"linklist.h"
//利用构造函数初始化单链表
LinkList::LinkList()
{
L = new LNode; //头指针指向头结点
L->Next = NULL;
L->Data = 0;
}
//显示菜单
void LinkList::MenuList()
{
cout << "---------1、头插法创建链表---------------------" << endl;
cout << "---------2、尾插法创建链表---------------------" << endl;
cout << "---------3、在链表中任意位置插入元素-----------" << endl;
cout << "---------4、在链表中任意位置删除元素-----------" << endl;
cout << "---------5、遍历单链表-------------------------" << endl;
cout << "---------6、返回单链表表长---------------------" << endl;
cout << "---------7、判断单链表是否为空-----------------" << endl;
cout << "---------8、按位查找返回值---------------------" << endl;
cout << "---------9、按值查找返回序号-------------------" << endl;
cout << "---------10、清空单链表------------------------" << endl;
cout << "---------0、销毁单链表并退出------------------" << endl;
}
//创建单链表L并使用头插法,插入n个元素
void LinkList::CreateList_H()
{
L = new LNode; //创建头结点
L->Next = NULL; //将头结点指针域置空
LNode* p; //创建指针变量p
int n; //记录插入个数
cout << "请输入你要插入的元素个数:" << endl;
cin >> n;
for (int i = 1; i <= n; i++)
{
p = new LNode; //生产新结点
cout << "请输入第" << i << "个元素:" << endl;
cin >> p->Data; //输入元素值
p->Next = L->Next; //将头结点的指针域赋值给新结点的指针域
L->Next = p; //头结点的指针域记录新结点的地址
}
cout << "插入完毕,按任意键继续" << endl;
system("pause");
system("cls");
}
//创建单链表L并使用尾插法,插入n个元素
void LinkList::CreateList_R()
{
L = new LNode; //创建头结点
L->Next = NULL; //将头结点指针域置空
LNode* r,*p; //创建尾指针r 新结点p
r = L; //将头指针赋值给尾指针,使尾指针也指向头结点
int n; //记录插入个数
cout << "请输入你要插入的元素个数:" << endl;
cin >> n;
for (int i = 1; i <= n; i++)
{
p = new LNode; //生产新结点
cout << "请输入第" << i << "个元素:" << endl;
cin >> p->Data; //输入元素值
p->Next = NULL; //将新结点指针域置为空
r->Next = p; //尾指针指针域指向新结点
r = p; //r指向新的尾结点
}
cout << "插入完毕,按任意键继续" << endl;
system("pause");
system("cls");
}
//在单链表L中第i个元素之前插入数据元素e
void LinkList::ListInsert()
{
LNode* p,*s; //创建指针变量p,s
p = L; //p指向头结点是因为可以在头结点之后插入,所以要从头结点开始出发
int i,e,j=0; //i记录插入位置,e记录插入元素,j记录序号
cout << "请输入要插入的位置:" << endl;
cin >> i;
while (p&&j<i-1) //p为空或找到i前一个元素,则停止循环
{
p = p->Next;
j++;
}
if (!p || j > i - 1) //!p为真则i大于表长+ 1,j >i-1为真则表示i小于1
{
cout << "输入的位置不合法" << endl;
}
else
{
s = new LNode; //创建新结点
cout << "请输入要插入的数据:" << endl;
cin >> e;
s->Data = e; //将e赋给s结点的数据域
s->Next = p->Next; //将p指针域中记录的下一结点地址赋给s结点的指针域
p->Next = s; //p结点指针域中记录结点s地址
cout << "插入成功,请按任意键继续" << endl;
}
system("pause");
system("cls");
}
//将单链表L中第i个数据元素删除
void LinkList::ListDelete()
{
LNode* p, * q; //创建指针变量p,q
p = L;
int i,e,select, j = 0; //i记录选择想要删除位置,e保存删除位置数据域,select选择是否删除
cout << "请输入要删除的位置:" << endl;
cin >> i;
while (p->Next && j <i-1) //p->为空或找到i前一个元素,则停止循环
{
p = p->Next;
j++;
}
if (!(p->Next) || j > i - 1)//!p->Next为真则输入的i大于表长+ 1,j >i-1为真则表示i小于1
{
cout << "输入的" << i << "不合法或不存在" << endl;
}
else
{
q = p->Next; //q结点记录要删除的结点
p->Next = q->Next; //p结点的指针域指向要删除结点的下一结点指针域
e = q->Data; //保存要删除结点的数据域
cout << "第" << i << "个位置中的元素为:" << e << " 请确认是否删除" <<endl;
cout << "1、是" << endl;
cout << "2、否" << endl;
cin >> select;
if (select == 1) //确认是否删除
{
delete q;
cout << "删除成功" << endl;
}
}
system("pause");
system("cls");
}
//遍历单链表L
void LinkList::PrintList()
{
LNode* p; //创建临时变量p
p = L->Next; //p指向第一个结点
while (p)
{
cout << p->Data << " ";
p = p->Next;
}
cout << endl;
system("pause");
system("cls");
}
//求单链表的表长
void LinkList::ListLength()
{
LNode* p; //创建临时变量p
p = L->Next; //p指向第一个结点
int count = 0; //统计表长
while (p) //判断p是否指向空,为空结束循环
{
count++;
p = p->Next; //p指向下一结点的指针域
}
cout << "单链表的表长为:" << count << endl;
system("pause");
system("cls");
}
//判断单链表是否为空
void LinkList::ListEmpty()
{
if (L->Next == NULL) //判断头结点指针域释放为空
{
cout << "单链表L为空" << endl;
}
else
{
cout << "单链表L不为空" << endl;
}
system("pause");
system("cls");
}
//获取单链表中的某个元素的内容,通过变量e返回
void LinkList::GetElem()
{
LNode* p; //创建临时变量p
p = L->Next; //p变量存放头结点的指针域
int i, e, j = 1; //变量i记录要查找的位置,e 记录查找到的数据,j记录序号
cout << "请输入你要查找的位置:" << endl;
cin >> i;
while (p && j < i) //判断当p为空或j = i是为假,则停止循环
{
p = p->Next;
++j;
}
if (!p || j > i) //当p为空或j>i时元素不存在
{
cout << "第" << i << "个元素不存在" << endl;
}
else
{
e = p->Data; //将查找到值赋给e
cout << "第" << i << "个位置元素为:" << e << endl;
}
system("pause");
system("cls");
}
//在线性表L中查找值为e的数据元素的位置序号
void LinkList::LocateElem()
{
LNode* p; //创建临时变量p
p = L->Next; //p变量存放头结点的指针域
int e,j = 1; //变量e记录要查找的元素,变量j记录序号
cout << "请输入你要查找的元素:" << endl;
cin >> e;
while (p&&p->Data != e) //判断当p为空或p->data中的数据=e时为假,则停止循环
{
p = p->Next;
j++;
}
if (p) //判断p是否为空,不为空则找到元素序号
{
cout << "元素" << e << "位置的序号为:" << j << endl;
}
else
{
cout << "未找到" << endl;
}
system("pause");
system("cls");
}
//清空单链表
void LinkList::ClesrList()
{
LNode* p, * q; //创建临时变量p,p
p = L->Next; //p变量存放头结点的指针域
while (p)
{
q = p->Next; //q变量存放p的下一指针域
delete p; //释放p
p = q; //将q变量中的内容返还给p
}
L->Next = NULL; //将头结点的指针域置为空
cout << "清空成功" << endl;
system("pause");
system("cls");
}
//销毁单链表并退出
void LinkList::DestroyList()
{
LNode* p; //创建临时变量p
while (L) //循环执行直到L为空退出循环
{
p = L; //将头指针L的值付给p
L = L->Next; //让头指针指向下一节点的指针域
delete p; //销毁p
}
cout << "销毁成功,欢迎下次使用" << endl;
system("pause");
exit(0);
}
三、在主函数中包含linklist.h头文件,并利用while、switch等循环实现功能调用。
#include<iostream>
using namespace std;
#include"linklist.h" //链表类头文件
int main()
{
LinkList L;
int select = 0;
while (true)
{
L.MenuList();
cout << "请输入你的选择:" << endl;
cin >> select;
switch (select)
{
case 1: //头插法创建链表
L.CreateList_H();
break;
case 2: //尾插法创建链表
L.CreateList_R();
break;
case 3: //在链表中任意位置插入元素
L.ListInsert();
break;
case 4: //在链表中任意位置删除元素
L.ListDelete();
break;
case 5://遍历单链表
L.PrintList();
break;
case 6://返回单链表表长
L.ListLength();
break;
case 7://判断单链表是否为空
L.ListEmpty();
break;
case 8://按位查找返回值
L.GetElem();
break;
case 9://按值查找返回序号
L.LocateElem();
break;
case 10://清空单链表
L.ClesrList();
break;
case 0://销毁单链表并退出
L.DestroyList();
break;
default:
cout << "输入有误请重新输入" << endl;
system("pause");
system("cls");
break;
}
}
system("pause");
return 0;
}
四、功能展示