实验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
相关推荐
大数据追光猿30 分钟前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!1 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉1 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生1 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴1 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing1 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财1 小时前
加油站(力扣134)
算法·leetcode·职场和发展
王老师青少年编程1 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
qy发大财1 小时前
柠檬水找零(力扣860)
算法·leetcode·职场和发展
瓦力的狗腿子1 小时前
Starlink卫星动力学系统仿真建模番外篇6-地球敏感器
算法·数学建模·simulink