实验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
相关推荐
半桔1 小时前
【STL源码剖析】二叉世界的平衡:从BST 到 AVL-tree 和 RB-tree 的插入逻辑
java·数据结构·c++·算法·set·map
塔中妖2 小时前
【华为OD】分割数组的最大差值
数据结构·算法·华为od
weixin_307779132 小时前
最小曲面问题的欧拉-拉格朗日方程 / 曲面极值问题的变分法推导
算法
RTC老炮2 小时前
webrtc弱网-AlrDetector类源码分析与算法原理
服务器·网络·算法·php·webrtc
孤廖2 小时前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
sali-tec2 小时前
C# 基于halcon的视觉工作流-章33-矩状测量
开发语言·人工智能·算法·计算机视觉·c#
凯子坚持 c2 小时前
Redis 核心数据结构:String 类型深度解析与 C++ 实战
数据结构·c++·redis
songx_993 小时前
leetcode29( 有效的括号)
java·数据结构·算法·leetcode
于樱花森上飞舞3 小时前
【java】常见排序算法详解
java·算法·排序算法
GawynKing3 小时前
图论3 图的遍历
算法·深度优先