数据结构单向链表(C++)

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;
}

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值