单链表的基本操作_LalmonDev的博客-程序员宅基地

技术标签: 单链表基本操作  数据结构  

单链表的基本操作,包括头插法、 尾插法、求表长、判断空、输出表元素、按位置查找结点值、按值查找表结点、 插入结点、 删除结点、销毁链表等。

注:仅供参考,有错误欢迎留言指出!

/*
*	带头结点的单链表的基本操作
*	By Lalmon
*	09/18/2019
**/

#include<iostream>
using namespace std;

typedef struct LNode
{
	int data;	//数据域
	struct LNode* next;	//指针域
}LNode,*LinkList;

//头插法
LinkList List_HeadInsert(LinkList& L)
{
	LNode* s;
	int x;	//插入的值
	L = (LinkList)malloc(sizeof(LNode));	//创建头结点
	L->next = NULL;	//初始为空链表
	cin >> x;
	while (x<=5)
	{
		s = (LNode*)malloc(sizeof(LNode));	//创建新结点
		s->data = x;	//数据赋值
		s->next = L->next;	//顺序不能乱。先是让插入的节点的next指向头结点的next(保护了头结点next)
		L->next = s;	//再让头结点的next指向插入的结点,完成插入

		cin >> x;
	}
	return L;
}

//尾插法
LinkList List_TailInsert(LinkList& L)
{
	int x;	//设元素类型为整形
	L = (LinkList)malloc(sizeof(LNode));
	
	LNode* s, * r = L;	//r为表尾指针
	cin>>x;	//输入结点的值
	while (x!=5)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;	//r指向新的表尾结点
		cin>>x;
	}
	r->next = NULL;
	return L;
}

//输出每个结点数据
void getItem(LinkList L)
{
	//带头结点链表
	LinkList h = new LNode;
	h = L->next;
	while (h)
	{
		cout << h->data << " ";
		h = h->next;
	}
	cout << endl;
}

//按序号查找结点值(返回一个对象)
LinkList getElem(LinkList L, int i)
{
	//首先对i的范围进行判断
	int j = 1;	//j从1开始,记录位置
	LinkList p = L->next;	//从头结点开始
	if (i==0)
	{
		return L;	//i=0,返回头结点
	}
	if (i<1)
	{
		return NULL;	//若i无效,则返回NULL
	}
	while (p!=NULL && j<i)
	{
		p = p->next;
		j++;
	}
	return p;	//要是循环提前结束,则返回p;要是循环没找到,正常结束,则p肯定为NULL,也直接返回
}

//按值查找(返回对象)
LinkList LocateElem(LinkList L, int e)
{
	LinkList p = L->next;	//从头结点开始
	while (p!=NULL && p->data!=e)
	{
		p = p->next;
	}
	return p;
}

//在第i个位置插入一个结点,值为e
LinkList ListInsert(LinkList& L, int i,int e)
{
	LinkList p, s;
	p = getElem(L, i - 1);	//找到第i-1个位置,看是否存在

	if (p==NULL)
	{
		cout << "Insert fale!" << endl;
	}
	else
	{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
		return p;
	}
}

//删除第i个结点
LinkList DeleteElem(LinkList& L, int i)
{
	LinkList p ,q;
	p = getElem(L, i -1);
	if (p==NULL)
	{
		cout << "Delete fale!" << endl;
	}
	else
	{
		//先用q记录下p->next,然后更换指向,最后释放q结点的内存
		q = p->next;
		p->next = q->next;
		free(q);	
		return p;
	}
}

//返回表长
int ListLength(LinkList L)
{
	int i = 0;
	LinkList p = L->next;
	while (p!=NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}

//判断表空
bool IsEmpty(LinkList L)
{
	LinkList p = L->next;
	if (p!=NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//摧毁链表
LinkList DestroyList(LinkList& L)
{
	/*
	*	区别摧毁和清空操作:
	*		清空是指保留头指针,但是链表依旧存在
	*		摧毁是把头结点一并摧毁
	*/
	LinkList p=(LinkList)malloc(sizeof(LNode));
	while (L!=NULL)
	{
		p = L->next;
		free(L);
		L = p;
	}
	return p;
}

int main()
{
	/*
	*	具体输入的结点个数请在两个插入函数中进行修改
	*	所有函数均经过测试
	**/
	LinkList L = (LinkList)malloc(sizeof(LNode));
	//List_HeadInsert(L);	//头插法
	//getItem(L);	
	//IsEmpty(L);	//判表空
	List_TailInsert(L);	//尾插法
	getItem(L);
	//cout << getElem(L, 2)->data << endl;	//按序号查找结点值
	//cout<< LocateElem(L,2)->data <<endl;	按值查找
	ListInsert(L, 2, 0);	//在第2个位置插入0
	getItem(L);
	DeleteElem(L,2);	//删除第2个位置的结点
	getItem(L);
	cout << "表长: " << ListLength(L) << endl;
	DestroyList(L);	//摧毁链表
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40495217/article/details/100999947

智能推荐

Zuul详解与实例_椰汁菠萝的博客-程序员宅基地

前言 介绍完分布式配置中心,结合前面的文章。我们已经有了一个微服务的框架了,可以对外提供api接口服务了。但现在试想一下,在微服务框架中,每个对外服务都是独立部署的,对外的api或者服务地址都不是不尽相同的。对于内部而言,很简单,通过注册中心自动感知即可。但我们大部分情况下,服务都是提供给外部系统进行调用的,不可能同享一个注册中心。同时一般上内部的微服务都是在内网的,和外界是不连通的。而且,就算我们每个微服务对外开放,对于调用者而言,调用不同的服务的地址或者参数也是不尽相同的,这样就会造成消..._zuul详解

Windows调试工具入门 — 1_eqera的博客-程序员宅基地

一、 引子Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg来作为这一套调试工具的简称)。我第一次接触是在三年前的一个内核驱动项目,由于进行了IDT中键盘鼠标中断的Hook,使用Softice调试时造成会造成影响,只得使用WinDbg通过串口进行双机调试。自此之后这个Windows平台下最为强大的调试工具一直

中小企业如何做恰当的资源分配?_CORNERSTONE365的博客-程序员宅基地

中小型企业发展上了轨道后,员工开始增加了,赋予其他资源的预算也多了,但这时却发现公司的效益增长不符合预期,更有可能与增加了的员工数目和资源不成正比。出现这种情况,说明企业可能资源错配了。换句话说,就是某些资源被错误调配到不合适的地方,不能达到资源效率最佳化。究竟中小企业应该如何做恰当的资源分配,才能好好地运用得来不易的资源和金钱呢?以下分享几种常见的做法:一、以产品利润决定资源分配其中一个传统企业的做法,就是以数据去调整和决定应该投放多少资源。有些企业会以产品的利润作为百分比,以决定投放资源的数目

实现变色TextView及ViewPager指示器(原来可以这么简单)_vv_小虫的博客-程序员宅基地

又是一天过去了,已经坚持写博客三天了,因为之前在研究自定义view,所以也积累了很多demo了,都是借鉴大神的然后自己敲了很多遍的东西,以前敲完都没什么感觉的,所以还是需要静下心总结一下的,于是我开始写博客了。 废话不多说了,进入我们今天的主题(变色TextView及ViewPager指示器),以前都是用github上面的ViewPagerIndicator,只管用了,感觉很高大上的东西,于是自己

源码资本宣布完成人民币四期38亿新基金募集_数据猿的博客-程序员宅基地

“数据猿年度重磅活动预告:2020年度金猿策划活动(金猿榜单发布+金猿奖杯颁发)即将推出,尽情咨询期待!大数据产业创新服务媒体——聚焦数据 · 改变商业数据猿报道,源码资本宣布于近日完成...

【两地三中心】两地三中心--灾备解决方案_weixin_33754065的博客-程序员宅基地

两地三中心,两地是指同城、异地,三中心是指生产中心、同城容灾中心、异地容灾中心。结合近年国内出现的大范围自然灾害,以同城双中心加异地灾备中心的“两地三中心”的灾备模式也随之出现,这一方案兼具高可用性和灾难备份的能力。同城双中心是指在同城或邻近城市建立两个可独立承担关键系统运行的数据中心,双中心具备基本等同的业务处理能力并通过高速链路实时同步数据,日常情况下可同时分担业务及管理...

随便推点

图片Uri或file地址转bitmap_uri转化为bitmap_大白菜打番茄的博客-程序员宅基地

1.Uri转bitmap// if (t is Uri) { //t是图片的Uri// val uri: Uri = t// bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, uri)// LogUtils.e("uri is uri..._uri转化为bitmap

前端技巧心得:学前端切忌浮躁,傲慢,懒惰_web前端迷惑_qq_41726885的博客-程序员宅基地

1.欲速则不达初学者请不要被新技术迷惑,先把基础学扎实。 尤其是html+css的部分,每天都要敲,边学边练习,初学者建议不要用带有提示功能的编程工具,建议使用editplus,来进行编写。每天反复的敲反复的练习,熟记代码。可以去w3cshool上学习,也可以加我们的学习群617327703,有一套专门给入门的小伙伴学习的视频资料。2.要扎扎实实要扎扎实实,一步一个脚印的学习,不要想着一步登天。给..._web前端迷惑

向量处理机5___混洗交换单级网络_shuffle-exchange_ximanni18的博客-程序员宅基地

混洗交换单级网络 (Shuffle-Exchange) 包含两个互连函数, 一个是全混(Perfect Shuffle), 另一个是交换(Exchange) .用互连函数表示为 Shuffle(Pn-1Pn-2...P1P0) = Pn-1Pn-2...P1P0式中, n= log2N, Pn-1Pn-2...P1P0 为入端编号的二进制码_shuffle-exchange

lr创建mysql odbc_【笔记】LR配置ODBC连接数据库进行参数化(mysql )未完待续 奔跑中的兔子..._楚沐风的博客-程序员宅基地

很多时候我们需要大量的参数数据,但是光光靠手填写是非常麻烦的,既然被测对象的数据都在数据库,那么我们直接读取数据库回来就轻松简便很多。data wizard 提供了一个从ODBC的连接获得数据转化成参数的过程。过程如下:一、配置ODBC1、打开windows 下的控制面板下的管理工具,找到ODBC数据源。2、为LR提供一个新的ODBC连接数据DSN,我们选择添加一个系统DSN.(根据使用的数据库..._lrmyvdb

使用python自动检测tomcat运行状态并自动重启_python判断apache是否挂掉_山间小楼一斤雾的博客-程序员宅基地

问题描述:最近接手了公司一套部署在tomcat上的软件系统,但是经常会出现内存溢出的问题,开发那边找不到原因,每次出问题就得重启服务,相当的麻烦,于是写了几行python代码自己检测服务并重启服务。基本思路:思路其实相当的简单,就是每隔一段时间访问一下服务页面,访问超时的话就直接执行tomcat的shutdown脚本和startup脚本。完整代码:import urllib.reques..._python判断apache是否挂掉

推荐文章

热门文章

相关标签