项目场景:

力扣141:循环链表的判定

在VS中初始化链表,涉及到节点结构体的初始化,


问题描述

在VS中初始化链表,涉及到节点结构体的初始化,一开始的写法:

typedef struct ListNode {int val;struct ListNode* next;
}Node,*Link;
struct ListNode* pnode_1, * pnode_2, * pnode_3, * pnode_4, * pnode_5,*head;
*pnode_1 = { -21,pnode_2 };>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>第一处报错//这样其实是对指针的内容赋值,而不是想象的对结构体赋值;如果用结构名赋值,才能这样写
pnode_1 = (struct ListNode*)malloc(sizeof(struct ListNode));>>>>>>>>第二处报错
bool hasCycle(struct ListNode* head);
int main(void)
{//省略………………
}bool hasCycle(struct ListNode* head)
{//省略………………}

原因分析:

第一处报错:

这样其实是对指针内容(不是结构体内容)赋值,而不是想象的对结构体赋值;如果用结构名赋值,才能这样写
通过结构体指针结构体名初始化结构体的方法不同,不管它里面是不是有指针

如图,最后一句
1.通过结构体指针初始化结构体

 pnode_1 = (struct ListNode*)malloc(sizeof(struct ListNode));if (pnode_1)//保证分配到了内存{pnode_1->val = -21;pnode_1->next = pnode_2;/*do something*/free(pnode_1);//否则报错取消对NULL指针的引用}

2.通过结构体名初始化结构体
这就如同数组,比较常规了

typedef struct book {char title[20];int price;}bookitem,*pbookitem;bookitem mybook = { "my love",20 };//结构体名

第二处报错:常量表达式中不允许函数调用

可以参照常量表达式不允许函数调用的解释
在C语言中,具有静态存储持续时间的对象只能使用常量表达式初始化。
您正在初始化一个全局变量pnode_1,它是一个具有静态存储持续时间的对象。您的表达式

(struct ListNode*)malloc(sizeof(struct ListNode));

不是常数表达式。正如编译器已经告诉您的那样,不允许您在常量表达式中调用函数。
如果要使用全局变量pnode_1,则用malloc函数“初始化”它的唯一方法是在程序启动时在某些函数中进行操作。这里把他放在main()函数中初始化

解决方案:

#include "stdio.h"
#include "stdbool.h"
#include "stdlib.h"typedef struct ListNode {int val;struct ListNode* next;
}Node,*Link;
struct ListNode* pnode_1, * pnode_2, * pnode_3, * pnode_4, * pnode_5,*head;
bool result;
//*pnode_1 = { -21,pnode_2 };//这样其实是对指针赋值,而不是想象的对结构体赋值;如果用结构名赋值,才能这样写
//pnode_1 = (struct ListNode*)malloc(sizeof(struct ListNode));不能缺失关键字struct;常量表达式不能使用函数
bool hasCycle(struct ListNode* head);int main(void)
{pnode_1 = (struct ListNode*)malloc(sizeof(struct ListNode));//不能缺失关键字structpnode_2 = (struct ListNode*)malloc(sizeof(struct ListNode));pnode_3 = (struct ListNode*)malloc(sizeof(struct ListNode));pnode_4 = (struct ListNode*)malloc(sizeof(struct ListNode));pnode_5 = (struct ListNode*)malloc(sizeof(struct ListNode));if (pnode_1 && pnode_2 && pnode_3 && pnode_4 && pnode_5)//保证都分配到了内存{pnode_1->val = -21;pnode_1->next = pnode_2;pnode_2->val = 10;pnode_2->next = pnode_3;pnode_3->val = 17;pnode_3->next = pnode_4;pnode_4->val = 8;pnode_4->next = pnode_5;pnode_5->val = 4;pnode_5->next = pnode_2;head = pnode_1;result=hasCycle(head);free(pnode_1);free(pnode_2);free(pnode_3);free(pnode_4);free(pnode_5);}result== true ? printf("true") : printf("false");}bool hasCycle(struct ListNode* head)
{struct  ListNode* pnode1, * pnode2;bool flag;//不初始化,flag默认为true(204),不是真实的true,if (flag == true)条件并不成立if ((head == NULL) || (head->next == NULL))//有环,则必须包含至少两个节点吧{flag = false;return flag;}for (pnode1 = head->next; pnode1 != NULL; pnode1 = pnode1->next)//最后一个节点的标志是该节点保存的节点为NULL{pnode2 = head;if (pnode1->next == NULL)//提前判断是否有尾巴,空指针{flag = false;break;}while (pnode2 != pnode1)//看前面的结构体有没有和pnode1中中指向的结构体相同的{if (pnode2 == pnode1->next){flag = true;break;//这里break跳出while循环,和while循环条件不满足而跳出循环,这两种情况如何区分?}pnode2 = pnode2->next;}if (flag == true)//这里就是区分两种情况,如果找到,则已经记录flag为true,及时跳出循环;如果一开始没有初始化,flag为true(204),在这里VS不认为与true相等;所以这个代码在VS里面可以判断是否有环,不过是由于VS更严谨吧{break;}}return flag;}

关于指针结构体的初始化相关推荐

  1. java 结构体数组初始化_C数组结构体联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  2. FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  3. go结构体初始化_浅谈golang结构体偷懒初始化

    运行一段程序,警告: service/mysqlconfig.go:63::error: golang.guazi-corp.com/tools/ksql-runner/model.CreatingM ...

  4. 更易上手的C语言入门级芝士 (3) 常见关键字+define+指针+结构体(超详细)

       目录 1.常见关键字 1.auto,break 2.switch,case,default,break 3.char,int等类型关键字 4.const 5.continue 6.extern ...

  5. [ C语言 ]指针---结构体(struct)---分支语句(1)---初识C语言末尾

    文章目录 前言 一,指针 二,结构体(struct) 三,分支语句(选择结构) 总结​​​​ 前言 本篇文章主要记录指针末尾,结构体,和分支语句(选择结构) --------------------- ...

  6. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  7. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  8. 用构造函数来完成结构体的初始化

    前言 说到结构体的初始化,人们会自然的想到先定义一个结构体变量,然后对其中的元素逐一赋值,以达到初始化的目的. 但是如果这样做,当结构体内变量很多时并不方便,此处介绍一种使用"构造函数&qu ...

  9. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

最新文章

  1. 为什么不推荐使用存储过程?
  2. opencv-dark channel -实现暗通道去雾详解
  3. 汇编语言的程序设计方法(循环结构和分支结构)
  4. XFire WebService demo
  5. php继承和重载区别,php继承中方法重载(覆盖)的应用场合
  6. 计算机网络的定义功能和分类,计算机网络的定义和分类.ppt
  7. axis2 java.net.url_axis2调用.net写的webservice接口实现,指定参数名
  8. 2008年下半年软件水平考试之程序员试题分析
  9. linux下tomcat部署java web项目_在linux下用tomcat部署java web项目的过程与注意事项
  10. python:拼接多个csv文件
  11. hibernate-annotation
  12. OpenCV(0)---机器学习库
  13. 估计理论(4):例5.8说明如何用完备的充分统计量找到MVU估计
  14. matlab拟合线性,Matlab 线性拟合 非线性拟合
  15. 牛客小白月赛21 I.I love you
  16. Online Object Tracking: A Benchmark
  17. 3000商家挤进云栖小镇,抢滩阿里速卖通平台
  18. txt文件字符在计算机,(35)在C盘当前文件夹下有一个已经建立好的顺序文件Alph.txt,文件内容为只含有字母的一个字符去、...
  19. WindowsCE目录解析
  20. 论文阅读_对比学习_SimCSE

热门文章

  1. flask_email实现QQ邮箱发送邮件
  2. 项目前端(一)、vue项目中引入vue-router路由组件
  3. 最全自动驾驶数据集分享系列一|目标检测数据集(2/3)
  4. flutter3 强制横屏,控制横竖屏显示
  5. 准时化生产方式与看板管理(zt)
  6. 魅族mx四核即将使用android,耳目一新 魅族MX四核Flyme OS UI界面赏析
  7. 数据库主键和外键的区别
  8. 简单的介绍进程的状态以及对应的英文字母表示
  9. PCIe之DMA(转)
  10. 使用企业微信快速注册腾讯云账号的方法