实验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 小时前
数据结构 ——— 快速排序的时间复杂度以及规避最坏情况的方法
c语言·数据结构·算法·排序算法·快速排序算法·三数取中
徐浪老师2 小时前
C语言实现冒泡排序:从基础到优化全解析
c语言·算法·排序算法
hr_net2 小时前
图论入门编程
算法·图论
李小白662 小时前
各种排序算法
数据结构·算法·排序算法
浪前2 小时前
排序算法之冒泡排序篇
数据结构·算法·排序算法
小黄编程快乐屋2 小时前
各个排序算法基础速通万字介绍
java·算法·排序算法
PeterClerk2 小时前
图论基础知识
算法·深度优先·图论
是糖不是唐2 小时前
代码随想录算法训练营第五十八天|Day58 图论
c语言·算法·图论
Eric.Lee20214 小时前
数据集-目标检测系列- 装甲车 检测数据集 armored_vehicles >> DataBall
python·算法·yolo·目标检测·装甲车检测
慢慢来_6 小时前
【力扣热题100】[Java版] 刷题笔记-448. 找到所有数组中消失的数字
笔记·算法·leetcode