实验3-单链表(优化版/王道版)

单链表结构体

cpp 复制代码
typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,* LinkList;

单链表的初始化

cpp 复制代码
void InitList(LinkList &L)
{
	L=new LNode;
	L->next=NULL;
}

打印单链表

cpp 复制代码
void visit(LinkList L)
{
	L=L->next;
	while(L){
		cout<<L->data<<" ";
		L=L->next;
	}
	cout<<endl;
}

头插法建表

cpp 复制代码
void HeadInsert(LinkList &L)
{
	InitList(L);
	LinkList p=NULL;
	ElemType e;
	cin>>e;
	while(e!=9999){
		p=new LNode;
		p->data=e;
		p->next=L->next;
		L->next=p;
		cin>>e;
	}
}

尾插法建表

cpp 复制代码
void TailInsert(LinkList &L)
{
	InitList(L);
	LinkList p;
	LinkList r=L;
	ElemType e;
	cin>>e;
	while(e!=9999){
		p=new LNode;
		p->data=e;
		r->next=p;
		r=p;
		cin>>e;
	}
	r->next=NULL;
}

求表长操作

cpp 复制代码
int Length(LinkList L)
{
	int len=0;
	L=L->next;
	while(L){
		len++;
		L=L->next;
	}
	return len;
}

按位查找结点

cpp 复制代码
LinkList GetElem(LinkList L,int i)
{
	if(i<0) return NULL;
	int j=0;
	while(L && j<i){
		L=L->next;
		j++;
	}
	return L;
}

按值查找结点

cpp 复制代码
LinkList LocateElem(LinkList L,ElemType e)
{
	L=L->next;
	while(L && L->data!=e) L=L->next;
	return L;
}

插入结点

cpp 复制代码
bool ListInsert(LinkList &L,int i,ElemType e)
{
	LinkList p=GetElem(L,i-1);
	if(p==NULL) return false;
	LinkList s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

删除结点

cpp 复制代码
bool ListDelete(LinkList &L,int i,ElemType &e)
{
	LinkList p=GetElem(L,i-1);
	if(p==NULL || p->next==NULL) return false;
	LinkList s=p->next;
	e=s->data;
	p->next=s->next;
	delete s;
	return true;
}

main函数

cpp 复制代码
int main()
{
	LinkList L;
	ElemType e;
	HeadInsert(L);//5 4 3 2 1 9999
//	TailInsert(L);//1 2 3 4 5 9999
	visit(L);
	cout<<"len:"<<Length(L)<<endl;
	cout<<"elem:"<<GetElem(L,5)->data<<endl;
	cout<<"pos:"<<LocateElem(L,5)<<endl;
	ListInsert(L,6,6);
	visit(L);
	ListDelete(L,6,e);
	visit(L);
	return 0;
}

完整代码

cpp 复制代码
	#include <iostream>
	using namespace std;
	typedef int ElemType;
	typedef struct LNode{
		ElemType data;
		struct LNode *next;
	}LNode,* LinkList;
	void InitList(LinkList &L)
	{
		L=new LNode;
		L->next=NULL;
	}
	void visit(LinkList L)
	{
		L=L->next;
		while(L){
			cout<<L->data<<" ";
			L=L->next;
		}
		cout<<endl;
	}
	void HeadInsert(LinkList &L)
	{
		InitList(L);
		LinkList p=NULL;
		ElemType e;
		cin>>e;
		while(e!=9999){
			p=new LNode;
			p->data=e;
			p->next=L->next;
			L->next=p;
			cin>>e;
		}
	}
	void TailInsert(LinkList &L)
	{
		InitList(L);
		LinkList p;
		LinkList r=L;
		ElemType e;
		cin>>e;
		while(e!=9999){
			p=new LNode;
			p->data=e;
			r->next=p;
			r=p;
			cin>>e;
		}
		r->next=NULL;
	}
	int Length(LinkList L)
	{
		int len=0;
		L=L->next;
		while(L){
			len++;
			L=L->next;
		}
		return len;
	}
	LinkList GetElem(LinkList L,int i)
	{
		if(i<0) return NULL;
		int j=0;
		while(L && j<i){
			L=L->next;
			j++;
		}
		return L;
	}
	
	LinkList LocateElem(LinkList L,ElemType e)
	{
		L=L->next;
		while(L && L->data!=e) L=L->next;
		return L;
	}
	bool ListInsert(LinkList &L,int i,ElemType e)
	{
		LinkList p=GetElem(L,i-1);
		if(p==NULL) return false;
		LinkList s=new LNode;
		s->data=e;
		s->next=p->next;
		p->next=s;
		return true;
	}
	bool ListDelete(LinkList &L,int i,ElemType &e)
	{
		LinkList p=GetElem(L,i-1);
		if(p==NULL || p->next==NULL) return false;
		LinkList s=p->next;
		e=s->data;
		p->next=s->next;
		delete s;
		return true;
	}
	int main()
	{
		LinkList L;
		ElemType e;
		HeadInsert(L);//5 4 3 2 1 9999
	//	TailInsert(L);//1 2 3 4 5 9999
		visit(L);
		cout<<"len:"<<Length(L)<<endl;
		cout<<"elem:"<<GetElem(L,5)->data<<endl;
		cout<<"pos:"<<LocateElem(L,5)<<endl;
		ListInsert(L,6,6);
		visit(L);
		ListDelete(L,6,e);
		visit(L);
		return 0;
	}

输出示例

bash 复制代码
5 4 3 2 1 9999
1 2 3 4 5
len:5
elem:5
pos:0xc56a20
1 2 3 4 5 6
1 2 3 4 5
相关推荐
xiaobai12 32 分钟前
二叉树的遍历【C++】
开发语言·c++·算法
Freak嵌入式9 分钟前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
java·开发语言·数据结构·python·接口·抽象基类
吱吱鼠叔27 分钟前
MATLAB数学规划:2.线性规划
算法·机器学习·matlab
声学黑洞仿真工作室34 分钟前
Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能
开发语言·人工智能·算法·matlab·微信公众平台
机器学习之心38 分钟前
选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)
算法·选址模型
MogulNemenis1 小时前
力扣春招100题——队列
数据结构·算法·leetcode
码上一元1 小时前
【百日算法计划】:每日一题,见证成长(017)
java·算法
学java的小菜鸟啊1 小时前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
菜鸟求带飞_2 小时前
算法打卡:第十一章 图论part01
java·数据结构·算法
浅念同学2 小时前
算法.图论-建图/拓扑排序及其拓展
算法·图论