head文件
#include<iostream>
#define status int
#define OK 1
#define ERROR 0
using namespace std;
typedef int elemType;
#include"head.h"
//单链表结点数据结构
typedef struct LNode{
elemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;//linklist是指向LNode结构的指针类型
//solution类
class solution{
public:
status InitList(LinkList &L);
int ListLength(LinkList L);
bool ListInsert(LinkList &L,int i,elemType e);
bool ListDelete(LinkList &L,int i);
LNode *LocateElem(LinkList L,elemType e);
void PrintList(LinkList L);
void Insert(LinkList &L);
void Delete(LinkList L);
void Search(LinkList L);
void menu();
solution();//空参构造函数
~solution();//析构函数
};
status solution::InitList(LinkList &L){
L = new LNode;//生成头结点 这样删除等操作就不必分第一个结点和其他了
L->next = NULL;
return 1;
}
//获取单链表长度 头结点无数据,不算
int solution::ListLength(LinkList L){
LinkList p=L;
int sum=0;
while(p){
sum++;
p=p->next;
}
return sum-1;//去除头结点
}
//插入函数--后插法 插入到第i(1<=i<=length+1)个位置 即i-1之后 不必区分i的位置
bool solution::ListInsert(LinkList &L,int i,elemType e){
LNode* s;
LinkList p=L;
int j=0;
while(p && (j<i-1)){//j指到i-1位置或者p已经到最后时跳出
p=p->next;
++j;
}
if(!p||j>i-1){//i<1或者i>ListLength(L)+1时,插入位置无效 不调用ListLength,提高效率
cout<<"插入位置无效!!!"<<endl;
return false;
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//删除函数 删除位置i的结点 即删除i-1之后的结点
bool solution::ListDelete(LinkList &L,int i){
LNode* s;
LinkList p=L;
int j=0;
LinkList q;
while(p && (j<i-1)){//j指到i-1位置
p=p->next;
++j;
}
if(!(p->next)||j>i-1){//i<1或者i>ListLength(L)时,删除位置无效
cout<<"删除位置无效!!!"<<endl;
return false;
}
q=p->next;
p->next=q->next;
free(q);//释放空间
return true;
}
//查找函数 按值查找 查找第一个等于e的结点 成功返回该结点指针,否则返回NULL
LNode* solution::LocateElem(LinkList L,elemType e){
LNode* p;
p=L->next;
while(p && (p->data!=e))
p=p->next;
return p;
}
//遍历输出函数
void solution::PrintList(LinkList L){
LinkList p=L->next;//跳过头结点
if(ListLength(L)){
cout<<"当前单链表所有元素:";
while(p){
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
else
cout<<"当前单链表已空!"<<endl;
}
//插入功能函数 调用ListInsert后插
void solution::Insert(LinkList &L){
int place;
elemType e;
bool flag;
cout<<"请输入要插入的位置(从1开始)及元素:"<<endl;
cin>>place>>e;
flag=ListInsert(L,place,e);
if(flag) {
cout<<"插入成功!!!"<<endl;
PrintList(L);
}
}
//删除功能函数 调用ListDelete删除
void solution::Delete(LinkList L){
int place;
bool flag;
cout<<"请输入要删除的位置(从1开始):"<<endl;
cin>>place;
flag=ListDelete(L,place);
if(flag) {
cout<<"删除成功!!!"<<endl;
PrintList(L);
}
}
//查找功能函数 调用LocateElem查找
void solution::Search(LinkList L){
elemType e;
LNode *q;
cout<<"请输入要查找的值:"<<endl;
cin>>e;
q=LocateElem(L,e);
if(q)
cout<<"找到该元素!位置为:"<<L->next<<endl;
else
cout<<"未找到该元素!"<<endl;
}
solution::solution(){
cout<<"\t\t\t\t\t\tThe author is DongShin."<<endl
<<endl
<<"\t\t\t\t\t\tAnd time is 2021.05.20."<<endl
<<endl;
}
solution::~solution(){
cout<<"\t\t\t\t\tBring out by C++."<<endl;
}
//菜单
void solution::menu(){
cout<<"\t\t\t\t\t********1.后插\t2.删除*********"<<endl
<<"\t\t\t\t\t********3.查找\t4.输出*********"<<endl
<<"\t\t\t\t\t********5.退出\t *********"<<endl;
}
//主函数
int main(){
solution debug;//类成员参数debug.
LinkList L;
int choice;
debug.InitList(L);//调用类成员
while(1){
cout<<"\t";
debug.~solution();
cout<<endl;
debug.menu();
cout<<"\t\t请输入菜单序号:"<<endl;
cin>>choice;
if(choice==5)
break;
switch(choice){
case 1:debug.Insert(L);
break;
case 2:debug.Delete(L);
break;
case 3:debug.Search(L);
break;
case 4:debug.PrintList(L);
break;
default:
cout<<"\t\t非法输入!"<<endl;
}
}//while()循环
system("pause>nul");//调用系统函数,等价于cin.get();
return 0;
}