08、单链表编程考点

单链表编程考点

1、将单链表的第一个结点放在单链表的最后一个结点的后面

/*
设h是无头结点的单链表,如果线性表h的长度不小于2,则将首元结点删除并插入到表尾
将单链表的第一个结点放在单链表的最后一个结点的后面
*/
typedef struct node
{elementype data;struct node *next;
}*linklist;void change(linklist &h)    //linklist &h等价于struct node *&h,这样就可以修改指针h的值;此时不需要return返回已经修改的单链表的值
{linklist p,q;			//linklist p,q等价于struct node *p、struct node *q;if(h && h->next)		//如果链表中有不少于2个结点{q = h;				//令p指向第1个结点hh = h->next;		//令h指向第2个结点p = h;				//令p指向第2个结点while(p->next)		//第一次循环时,判断第2个结点的指针域是否为空,如果为空则只有两个结点,则不需要找到最后的一个结点,否则一直循环,找到最后一个结点为止p = p->next;	//顺着p开始往下找,一直找到最后一个结点p->next = q;		//将第一个结点接在最后一个结点后面q->next = NULL;		//新的尾结点没有后继,置后继为空}
}
/*分析:1、在if判断语句中h为单链表的某一指针指向单链表中的某一个结点2、q = h;此语句的含义是另外一个指针q与指针h同时指向同一个结点3、h = h->next;此语句中的h->next所表示的含义是h->next指向单链表中h指针指向的下一个结点,与此同时h指针和h->next指针同时指向该结点
*/

 

typedef struct node
{elementype data;struct node *next;
}*Linklist;Linklist mynode(LinkList L)		//L是不带头结点的单链表的头指针
{if(L && L->next)			//如果链表中有不少于2个结点{q = L;					//令p指向第1个结点hL = L->next;			//令h指向第2个结点p = L;					//令p指向第2个结点while(p->next)p = p->next;			//顺着p开始往下找,一直找到最后一个结点p->next = q;			//将第一个结点接在最后一个结点后面q->next = NULL;			//新的尾结点没有后继,置后继为空}return L;
}

 

2、实现单链表的删除算法,删除成功返回1,删除失败返回0

/*实现单链表的删除算法,删除成功返回1,删除失败返回0*/
typedef struct node
{elementype data;struct node *next;
}*LinkList, LNode;int ListDelete(LinkList L, int i, ElemType *s)        //s是存储将要删除的值,i是将要被删除元素的指定位置
{LNode *p,*q;								  	  //定义了两个新的指针变量p、q;int j;p = L;											  //p指向L单链表的第一个结点元素j = 0;while((p->next != NULL)&&(j < i-1))				  //j < i-1此处的判断条件是i-1的原因是当最后一次,不满足条件之前,j的值自动增加了一位{p = p->next;								  //而我们进行删除操作的前提是找到被删除结点元素的前驱结点j++;										}if(p->next == NULL || j > i-1)return 0;									//如果if语句成立,将执行return 0;语句,运行过程终止q=p->next;										//否则将q指针指向p->next指针所指的结点,即指向被删除结点元素										*s = q->data;p->next = q->next;								//此语句将指定位置的结点删除,p->next所代表的是被删结点元素的前驱结点的next指针域,而q->next指向被删结点元素的后继结点free(q);										//释放结点占有的存储空间return 1;
}

 

3、尾插法建立单链表

//尾插法建立单链表
typedef struct node
{int data;struct node *next;
}lklist;
void lklistcreate(lklist *&head ,int n)					//n表示单链表的长度
{lklist *q;											//定义一个新的结点指针	for(i = 1;i<=n;i++){							p=(lklist *)malloc(sizeof(lklist));				//创建一个新的结点scanf("%d",&(p->data));							//获取该结点的数值p->next = NULL;if(i==1)head = q = p;								//head = q = p;该语句表示头指针head,新的结点指针q都指向结点p;else{q->next = p;								//注意:定义的新的结点指针q的作用是通过移动该指针的指向,来实现链表的创建,将q结点的next指针域指向最新创建的结点q=p;										//将结点连接以后,再改变q指针的指向,为下一次新结点的创建作好准备}}
}

  

4、逆转线性单链表,采用是头插法

//逆转线性单链表,采用是头插法
typedef struct node					//就地逆置单链表
{elemtype data;struct node *next;
}node;
node *Reverse (node *head)			//head是带头结点的单链表
{node *p ,*q;p = head->next;					//p指向第一个元素head->next=NULL;				//保留第一个元素,将头结点的指针域置空while(p!=NULL)					//将原链表的元素用头插法插入新的链表中{q=p;						//令q指向链表的当前第一个元素p=p->next;					//p指针后移q->next = head->next;		//在新表中插入结点qhead->next = q;}return head;
}

  

5、在带头结点的单链表L中,删除所有值为x的结点

//在带头结点的单链表L中,删除所有值为x的结点
typedef struct LNode
{Elemtype data;struct LNode *next;
}LNode, *Linklist;
void delete(Linklist &L ,ElemType x)
{LNode *q=L;LNode p=L->next;			//初始化p指向第一个结点,q始终指向p结点的前驱while(p!=NULL){if(p->data == x)		//若p指针指向当前结点的值等于x{q->next = p->next;free(p);			//删除该结点,并修改p指针p=q->next;			//寻找链表中下一个值为x的结点}else{q=p;p=p->next;			//先使q后移,p向后移动}}
}

  

6、有序递增序列,删除所有值大于mink且小于maxk的元素

//有序递增序列,删除所有值大于mink且小于maxk的元素
typedef struct node					//就地逆置单链表
{elemtype data;struct node *next;
}node;
void Delete_Between(node *head, int mink, int maxk)
{node *p = head, *q;while(p->next->data <= mink)			//p是最后一个不大于mink的元素p=p->next;if(p->next)								//如果还有比mink更大的元素{q=p->next;while(q->data<maxk)					//q是第一个不小于maxk的元素q=q->next;							//while循环结束以后,q指向比maxk值还大的结点元素p->next = q;						//此语句是删除所有值大于mink且小于maxk的元素						}
}

  

7、将带头结点单链表h1和h2合并成升序排列的单链表

//将带头结点单链表h1和h2合并成升序排列的单链表
typedef struct L
{int data;struct L *next;
}LinkL;
LinkL *mergeList(LinkL *h1, LinkL *h2)
{LinkL *h, *Next, *q;h=h1;Next = h;h1=h1->next;								//表h1的第一个结点h2=h2->next;								//表h2的第一个结点while(h1 != NULL && h2 != NULL)				//如果表h1和h2均不为空表{if(h1->data <= h2->data)				//如果h1指针所指向当前结点的值小于h2{										//指针所指向的当前结点的值q=h1;								//则令q暂存h1指针所指向的结点h1=h1->next;						//h1指针向后移动}else										//如果h2指针所指向当前结点的值小于h1{											//指针所指向的当前结点的值q=h2;									//则令q暂存h2指针所指向的结点h2-h2->next;							//h2指针向后移动}Next->next = q;					//将指针p所指向的结点接在Next指针所指的结点后面Next = q;						}if(h1 == NULL)						//如果原h2链表中所有结点已插入但是原h1链表还有结点没插完,则直接把剩余部分接在next指针后面。要是原h1表的所有结点已经全部插完但是h2还有结点没插完,亦是如此Next->next = h2;if(h2 == NULL)Next->next = h1;return h;							//返回新表的指针}

  

8、用单链表lc表示集合C,分别将la中的元素取出,再在lb中进行查找,如果在lb中出现,则将其插入到lc中

//将单链表A分解成一个小于零的单链表和大于零的单链表
typedef struct node					
{elemtype data;struct node *next;
}*LinkList,Linknode;
void decompose(LinkList La,LinkList Lb,LinkList Lc)
{Linknode *p;								Lc=(Linknode *)malloc(sizeof(Linknode));	Lc->next = NULL;							//表C的头结点的next域置空p=La->next;									//令p指向表A的第一个元素结点Lb=La;										//令Lb指向表LaLb->next = NULL;							//令表La的next域置空while(p)									//遍历原表A{La=p->next;								//令La暂存p结点的后继指针if(p->data >0)							//如果p结点值大于0,则接在表C后面{p->next=Lc->next;Lc->next = p;}else{									//如果p结点的值小于0,则接在表B后面p->next =Lb->next;Lb->next = p;}p=La;									//令p指向原p所指向的结点的下一个位置}
}

  

9、将单链表A分解成一个小于零的单链表和大于零的单链表

//用单链表lc表示集合C,分别将la中的元素取出,再在lb中进行查找,如果在lb中出现,则将其插入到lc中
typedef struct node					
{elemtype data;struct node *next;
}*LinkList,LNode;
void interaction(LinkList la, LinkList lb, LinkList &lc)
{LinkList pa ,pb, pc;lc = new LNode();								//生成lc的头结点pc=lc;											//pc永远指向lc的尾结点pa=la->next;									//pa指向la的第一个元素while(pa){pb=lb->next;								//pa指向lb表的第一个元素while(pb && pb->data != pa->data)pb=pb->next;							//在pb中查找元素,使其值等于pa->dataif(pb)									//如果存在这样的元素{pc->next = new LNode();				//生成lc新的尾结点pc = pc->next;						//pc指向新的尾结点pc->data= pa->data;					//将pa->data复制到pc中}pa=pa->next;							//继续比较pa表的下一个结点元素}pc->next =NULL;									//pc为尾结点,pc表比较完成后,置pc后继为空
}

  

10、已知指针hb和ha分别指向两个单链表的头结点,长度为m和n,假设hc指向连接后的链表的头结点

//已知指针hb和ha分别指向两个单链表的头结点,长度为m和n,假设hc指向连接后的链表的头结点
typedef struct node					
{elemtype data;struct node *next;
}LinkList; 
void ListConcat(LinkList ha, LinkList hb, LinkList *hc)
{	LinkList p;                     //把链表hb接在ha后面形成链表hchc=ha;							//由指针p指向ha的尾元结点while(p->next !=NULL)			//查找原ha表的最后一个结点p=p->next;p->next = hb->next;				//把hb表的第一个元素及其后面元素接在p指针指向的结点后面free(hb);
}

  

11、删除单链表中重复的元素

//删除单链表中重复的元素
typedef struct node					
{elemtype data;struct node *next;
}LinkedList ,*LNode; 
LinkedList DeleteSameElement(LinkedList L)
{									//L为递增有序的单链表LNode u;LinkedList p, pre;pre = L->next;					//pre指针指向第一个元素结点p= pre->next;					//p指向pre所指结点的后继结点while(p!=NULL)					//如果p指针不为空if(p->data == pre->data)		//p所指结点的值等于pre所指结点的值{u=p;						//用指针u暂存p指针所指向的结点p=p->next;					//p指针后移free(u);					//释放掉u指针所值结点的内存空间}else{							//p和pre两指针所指向的结点值不相等pre = p;					//pre指针后移p = p->next;				//p指针后移}
}

  

12、交换单链表中指针p所指结点与其后继结点

//交换单链表中指针p所指结点与其后继结点
typedef struct node					
{elemtype data;struct node *next;
}*LinkList; 
int exchange(Linklist &head,Linklist p )
{LinkList q=head->next;				//q指向第一个元素结点LinkList pre=head;					//pre指向头结点while(q!=NULL && q!=p)		        //顺着链表开始查找,一直到q=p{pre=q;q=q->next;}if(p->next ==NULL)			        //退出循环之后,若p无后继,则交换失败return 0;else{q=p->next;pre->next = q;p->next = q->next;q->next = p;}return 1;
}

  

13、设有一个无序单链表
  1)找出最小值结点
  2)若该数是奇数将与其直接后继结点的数值交换
  3)该数值是偶数将直接后继结点删除

 /*
设有一个无序单链表
1、找出最小值结点
2、若该数是奇数将与其直接后继结点的数值交换
3、该数值是偶数将直接后继结点删除
*/
typedef struct node					
{elemtype data;struct node *next;
}LinkList; 
void OutputMin(LinkList L)
{int temp;LinkList q = L->next;				//p指向第一个元素结点LinkList p= q;while(q){									//找出最小值结点p,并打印p结点数值if(p->data >q->data)p=q;						//如果发现还有比p指针所指结点的值更小的结点,令p指向该结点,否则q后移q=q->next;}printf("%d",p->data);if(p->next != NULL)					//找到了值最小的结点,若该结点有后继结点{if(p->data % 2 == 1)			//如果该最小值是奇数,则与其后继结点交换{temp=p->data;p->data =p->next->data;p->next->data = temp;}else							//如果该最小值是偶数,则删除其后继结点{q=p->next;p->next = q->next;free(q);}}
}

  

  

转载于:https://www.cnblogs.com/wxt19941024/p/7460528.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios nstimer实现延时_iOS中定时器NSTimer的使用

1、初始化 (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector us…

小程序产品的特点

认识小程序&#xff1a; 小程序&#xff1a;一种不需要下载安装&#xff0c;即可使用的应用。 小程序的特点&#xff1a; 开发成本低。 流畅的使用体验。 庞大的流量池可供使用。 用完即走&#xff0c;不占用手机内存&#xff0c;但是有使用记录供用户可方便的再次找回产品。…

数据库优化 - 多列索引经典题目

题目 假设某个表有一个联合索引&#xff08;c1,c2,c3,c4&#xff09;一下——只能使用该联合索引的c1,c2,c3部分 A where c1x and c2x and c4>x and c3x B where c1x and c2x and c4x order by c3 C where c1x and c4 x group by c3,c2 D where c1x and c5x order by c2,c3 …

nemesis什么车_狂野飙车9TrionNemesis介绍 S级车Trion复仇女神属性详解

狂野飙车9S级车Trion Nemesis介绍&#xff0c;狂野飙车9S级车Trion复仇女神属性详解&#xff0c;下面雨落就为大家带来狂野飙车9S级车Trion复仇女神的改装升级所需卡牌已经金币等攻略。【赛车属性】&#xff1a;S级车Trion Nemesis初始油量&#xff1a;4补充时间&#xff1a;15…

网站设计规范

网站不同于移动应用&#xff1a; 屏幕适配&#xff08;屏幕尺寸、分辨率&#xff09;。 交互方式不同&#xff0c;鼠标相对手指具备更精准的点击范围&#xff0c;有更多的控件状态。 在设计网站原型时&#xff0c;并没有具体的控件大小和条栏规范&#xff0c;需要注意相关设计…

产品设计七大定律

Alan Cooper&#xff08;交互设计之父&#xff09;&#xff1a;除非有更好的选择&#xff0c;否则就遵从标准。 许多设计准则都基于人类心理学&#xff1a;人们如何感知、学习、推理、记忆&#xff0c;以及把意图转换为行动。 菲茨定律&#xff1a; 菲茨定律用来预测某点到目…

函数的定义

什么是函数&#xff1f; 先上一个函数格式&#xff0c; def 函数名(参数1,参数2):       #函数的定义函数名&#xff1a;这是一个解决什么问题的函数:param 参数1: 传入一个参数:param 参数2: 传入第二个参数:return: 返回一个列表                #函数…

插入网站连接_带你了解网站设计的五个基本步骤

网站制作设计并不是一件简单的事情&#xff0c;一个好的网站不但里面包含的内容要全面&#xff0c;而且还要能够持续运转&#xff0c;为我们带来流量。下面简单为大家介绍一下网站设计的基本步骤&#xff0c;希望能够帮助大家更好的了解网站建设。网站设计1、站点定位确定网站的…

内容型的产品该怎么做?

内容产品&#xff1a; 什么是内容型产品&#xff1a;以图文、视频/直播、音频等形式提供服务的产品形态。 例&#xff1a;抖音、快手、微博、今日头条、知乎、得到… 内容产品的发展&#xff1a; 内容产品生态&#xff1a; 内容产品用户角色及职责&#xff1a; 内容模型&#x…

ssh免密码登陆(三个节点master slave1 slave2)详细带命令版

准备工作&#xff1a; 首先修改三个节点的名称分别为master slave1 slave2。建议以vim /etc/sysconfig/network的方式修改 修改三个节点的/etc/hosts文件 如下形式&#xff1a; 192.168.43.202 master 192.168.43.253 slave1 192.168.43.113 slave2 前面为各自机器对应的IP 配置…

复杂电路简化经典例题_一天搞定考试系列之电路原理(3)

经过了前两章对阅读理解学习法的实践运用&#xff0c;想必大家知道该怎么做了&#xff0c;至于效果&#xff0c;我不敢保证对每个人都有效&#xff0c;欢迎大家实践后给予反馈&#xff0c;大家一起寻找更好的方法。下面进入第三章&#xff0c;需要说明的是前两章虽然简单但是很…

【前端】Github Pages 与域名关联简明教程

Github Pages 与域名关联简明教程 1. 向你的 Github Pages 仓库添加一个CNAME(一定要*大写*)文件 其中只能包含一个顶级域名&#xff0c;像这样&#xff1a; example.com如果你是用 hexo 框架搭建博客并部署到 Github Pages 上&#xff0c;每次 > hexo g > hexo d 后会把…

登录注册页怎么做

app常见页面&#xff1a; 引导页&#xff1a; 概念&#xff1a;第一次安装App或者更新App后第一次打开App时所展示的可以滑动的页面。 作用&#xff1a;主要是用于展示产品本身的一些核心功能点或者特色。 启动页&#xff1a; 概念&#xff1a;App被用户打开后&#xff0c;在启…

怎么把东西去掉修图_很多人花几千块学习商业修图,其实跟把钱扔了一样。?...

很多人花几千块学习商业修图&#xff0c;其实跟把钱扔了一样。我所说的商业修图是指那些杂志、明星修图&#xff0c;很多人觉得修杂志、明星就是大师&#xff0c;就非常厉害&#xff0c;其实商业修图重要的不是技术&#xff0c;而是资源、圈子&#xff1b;大部分人看作品也不是…

算法入门经典-第七章 例题7-2最大乘积

最大乘积 输入n个元素组成的序列s&#xff0c;你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是正数&#xff0c;应输入-1&#xff08;表示无解&#xff09;。输入0结束输入。1<n<18,-10<Si<10。 样例输入&#xff1a; 3 2 4 -3 样例输出&#xff1a; …

Golang_String常用操作

字符串操作&#xff1a; 字符操作不会影响原字符串&#xff0c;如果处理后又返回给原字符串则会改变&#xff0c;但一般是使用新变量接收处理 len&#xff1a;统计字符串的长度&#xff0c;但如果有中文时会出现乱码的情况&#xff0c;转换为range可以解决 func main() {str :…

h5页面生成图片分享到微信js_html2canvas 动态生成微信分享海报的优质js库

如何把网页上的内容用javascript来实现截图&#xff1f;今天分享的html2canvas就可以。介绍在微信项目中经常会遇到动态生成海报的需求&#xff0c;Web前端合成图片往往会使用canvas。canvas虽然强大&#xff0c;但用来合成海报非常繁琐&#xff0c;一不小心就几百行代码了。而…

去重+排序板子(set+map)

题意&#xff1a; 给定n个数&#xff0c;去重排序后输出个数和每个数 1.map实现 #pragma GCC optimize("O2") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #i…

expires为session_面试必问:session,cookie和token的区别

点击上方蓝字关注我们 !session&#xff0c;cookie和token究竟是什么简述cookie&#xff0c;session&#xff0c;token作为面试必问题&#xff0c;很多同学能答个大概&#xff0c;但是又迷糊不清&#xff0c;希望本篇文章对大家有所帮助http是一个无状态协议什么是无状态呢&…

WINFORM 调用 Close 不会释放窗体

在以下两种情况下调用 Close 不会释放窗体&#xff1a;(1) 窗体是多文档界面 (MDI) 应用程序的一部分且是不可见的&#xff1b;(2) 您是使用 ShowDialog 显示的该窗体。在这些情况下&#xff0c;需要手动调用 Dispose 来将窗体的所有控件都标记为需要进行垃圾回收。外部链接转载…