C语言中->含义,比如说 p=p->next_c语言->next-程序员宅基地

->叫做结构体指针运算符,也是用来访问结构体内部成员的。换种说法,如果我们在C语言中定义了一个结构体,然后声明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
举个例子:

struct Data
{
int a,b,c;
}; /*定义结构体类型*/
struct Data * p;                 /*  定义结构体指针   */
struct Data A = {1,2,3};         / *  声明结构体变量A,A即结构体名   */
int x;                               /*  声明一个变量x  */
p = &A ;                           /*   地址赋值,让p指向A    */
x = p->a;        /* 取出p所指向的结构体中包含的数据项a赋值给x   */
/* 此时由于p指向A,因而 p->a == A.a,也就是1 */

因为此处p 是一个指针,所以不能使用.号访问内部成员(即不能p.a),而要使用->。但是A.a是可以的,因为A不是指针,是结构体名。

一般情况下用“.”只需要声明一个结构体。格式是:结构体类型名+结构体名。然后用结构体名加“.”加成员名就可以引用成员了。因为自动分配了结构体的内存。如同 int a;一样。

用“->”,则要声明一个结构体指针,还要手动开辟一个该结构体的内存(上面的代码则是建了一个结构体实例,自动分配了内存,下面的例子则会讲到手动动态开辟内存),然后把返回的地址赋给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。

此外,(*p).a 等价于 p->a。

而对于 p = p->next;这应该出现在C语言的链表,其中的next应该是自定义的一个与p同类型的结构体指针,定义格式为:

struct Data 
{
   int a;
   struct Data * next;
};/*定义结构体*/
…………
main()
{
   struct Data * p;/*声明指针变量p*/
  ……
   p = p->next;/*将next中的值赋给p*/
}

以下是参考《啊哈!算法》中的链表中的每一个结点应该如何存储(我的理解是结点就类似java等面向对象编程中的实例对象)

在这里插入图片描述
如上图,每一个结点都由两个部分组成。左边的部分用来存放具体的数值,那么用一个整型变量就可以;右边的部分需要存储下一个结点的地址,可以用指针来实现(也称为后继指针)。

这里我们定义一个结构体类型来存储这个结点,如下。

struct node
{
	 int data;
	struct node *next;
};

在这里插入图片描述
上面代码中,我们定义了一个叫做node 的结构体类型,这个结构体类型有两个成员。第一个成员是整型data,用来存储具体的数值;第二个成员是一个指针,用来存储下一个结点的地址。因为下一个结点的类型也是struct node,所以这个指针的类型也必须是struct node* 类型的指针。

如何建立链表呢?首先我们需要一个头指针head 指向链表的最开始。当链表还没有建立的时候头指针head 为空(也可以理解为指向空结点)。

struct node *head;
head = NULL;//头指针初始为空

现在我们来创建第一个结点,并用临时指针p 指向这个结点。

struct node *p;
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));

接下来分别设置新创建的这个结点的左半部分和右半部分。

scanf("%d",&a);
p->data=a;//将数据存储到当前结点的data域中
p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空

在这里插入图片描述
下面来设置头指针并设置新创建结点的*next 指向空。头指针的作用是方便以后从头遍历整个链表。

if(head==NULL)
head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
else
q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点

如果这是第一个创建的结点,则将头指针指向这个结点。
在这里插入图片描述
如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点。
在这里插入图片描述
最后要将指针q 也指向当前结点,因为待会儿临时指针p 将会指向新创建的结点。

q=p;//指针q也指向当前结点

当然,完整的代码是下面的那样子:

#include <stdio.h>
#include <stdlib.h>
//这里创建一个结构体用来表示链表的结点类型
struct node
{
	int data;
	struct node *next;
};
int main()
{
	struct node *head,*p,*q,*t;
	int i,n,a;
	scanf("%d",&n);
	head = NULL;//头指针初始为空
	for(i=1;i<=n;i++)//循环读入n个数
	{
		scanf("%d",&a);
	//动态申请一个内存空间,用来存放一个结点,并用临时指针p指向这个结点
		p=(struct node *)malloc(sizeof(struct node));
		p->data=a;//将数据存储到当前结点的data域中
		p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
		if(head==NULL)
			head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
		else
			q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
		q=p;//指针q也指向当前结点
}
//输出链表中的所有数
		t=head;
	while(t!=NULL)
	{
		printf("%d ",t->data);
		t=t->next;//继续下一个结点
	}
	getchar();getchar();
	return 0;
}

需要说明的一点是:上面这段代码没有释放动态申请的空间,虽然没有错误,但是这样会很不安全,有兴趣的朋友可以去了解一下free 命令。

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

智能推荐

mac电脑常见的一些问题_mac常见故障-程序员宅基地

文章浏览阅读130次。在安全与隐私中,一直不显示任何来源,需要的操作终端输入:sudo spctl --master-disable ,然后输入密码即可_mac常见故障

思科交换机配置命令大全-程序员宅基地

文章浏览阅读374次。思科交换机配置命令大全switch> 用户模式1:进入特权模式enableswitch> enableswitch#2:进入全局配置模式configure terminalswitch> enableswitch#c onfigure terminalswitch(conf)#3:交换机命名hostname aptech2..._思科交换机写cost

QStackedWidget设置无效问题-程序员宅基地

文章浏览阅读2.6k次。QStackedWidget设置无效问题在对QStackedWidget中的index窗体设置了样式,发现index为0的窗体样式无效,但是其它index都正常。解决方法: 1. addwidget()必须在setObjectName()之后。至于什么原因,暂时没弄清楚 2. 也可以在界面都初始完成之后,再调用(重新设置一次程序样式):QFile file(":/prefix/gui_blue.

JavaSE基础复习day01-程序员宅基地

文章浏览阅读815次,点赞4次,收藏2次。学习目标* 能够说出JDK,JRE,JVM各自的作用和关系* 能够完成HelloWorld案例的编写及运行* 能够使用注释对程序进行说明* 能够知道标识符、关键字的特点* 能够知道常量的分类* 掌握JDK、eclipse的安装配置第1章 初识Java1.1 Java语言概述1.1.1 Java简介Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级的编程语言。所谓编程语言,是计算机的语言,人们可以使用编程语言对计算机下达命令,让

Windows服务简单开发_windows服务开发-程序员宅基地

文章浏览阅读2.9k次。Windows服务简单开发_windows服务开发

MATLAB解决正态分布数据的大致方法-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏55次。当我们有了一个矩阵,如何判断矩阵里面的元素是否满足正态分布,以及如何绘制图像和求参数。我根据自己最近使用matlab的一些体会,将大致方法写下。1、矩阵元素转化成行向量 reshape()函数example:A = 1 2 3 4 5 6 7 8 9>> B=reshape(

随便推点

最小生成树算法之Prim(普里姆)算法_最小生成树prim算法-程序员宅基地

文章浏览阅读2.7w次,点赞103次,收藏510次。最小生成树的可以通过Kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出。Prim算法基本介绍:Prim算法又称为"加点法",每次找出距离(此处的距离指的是距离最小生成树的距离,若此处无法理解,可直接跳过,看完下面例子就能理解)最小的边对应的点。算法逐渐从某一个顶点s开始,逐渐将n个点纳入最小生成树中。Prim算法基本步骤:第一步:设图中所有顶点的集合为V,u代表已经加入最小生成树的顶点的集合,v代表未加入最小生成树的顶点的集合,最由于从某点s开始,因此u={s},v={V-u}_最小生成树prim算法

java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏9次。 标题没贴完整,这里补充下异常情况:java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened because it does not exist这是一个很奇葩的问题,好多原因都可以导致这种问题,还有一点就是clean及package后启动Tomcat...

超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!_java学习路线 知乎-程序员宅基地

文章浏览阅读6.7k次,点赞30次,收藏204次。之前写过很多次关于Java学习指南、Java技术路线图的文章。但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃。于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来,做成一份非常硬核的Java学习指南+路线图,一篇文章搞定Java学习,360度无死角(可能)如果你们喜欢这类硬核的文章,以后我也会继续这么硬核下去的!不要忘了分享噢。以下就是本文的主要内容,万字长文,你可悠着点看,拒绝到收藏夹吃灰!一、Java学习路线图1 计算机基础2Java编程..._java学习路线 知乎

用原生VideoView进行全屏播放时的问题_videoview mvideoview.setzorderontop(true);其他界面显示不出-程序员宅基地

文章浏览阅读1.1k次。之前参加了一个课程,里面有一节讲到了用视频作为启动界面。讲师用的是自定义VideoView,重写onMeasure方法,因为原生的VideoView在那情况下不能实现全屏播放。当时没有深入研究,现在补回来。用的是36氪之前的视频(608×1080)和Genymotion中的Google Nexus 5(1080×1920)。 一、效果图1、原生VideoView的效果,这里没有让底_videoview mvideoview.setzorderontop(true);其他界面显示不出来

latex编译中遇到的错误-程序员宅基地

文章浏览阅读9k次,点赞6次,收藏5次。问题一、:编译报错Misplaced alignment tab character & 点击跳到.bbl文件里面错误原因:在LaTeX中&符号有特殊含义,不能直接写,需要使用转义字符的形式。即 \&。而LaTeX引文.bib 插入的由google学术或者百度学术复制来的bibtex中有&字符修改:在.bib文件中,将& 改为 \&,删除....

学习网络平台的路线图-程序员宅基地

文章浏览阅读111次。The Web Platform is an amazing ecosystem of APIs, tools, languages, and it is more powerful than ever today. Web平台是由API,工具,语言组成的令人惊叹的生态系统,它比以往任何时候都功能强大。 I wrote a lot of tutorials and articles on t...