OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5044|回复: 10

一个难懂的C语言问题,感觉有点棘手

[复制链接]

7

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2017-3-26
在线时间
65 小时
发表于 2018-9-19 15:59:51 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 学海无涯xy 于 2018-9-19 16:08 编辑

typedef struct _VControl_VControl{    char         *name;  
      struct _V _VControl *pParent ;   
    void            *usrData;                   
} VControl;
...........
...........VCo
VControl PhotoObjCtrl;
我的问题是如何理解最后定义的  PhotoObjctrl  变量呢?还有就是结构体VControl里面有结构体成员 struct _VControl *pParent;这是什么意思啊?PhotoObjCtrl



最佳答案

查看完整内容[请看2#楼]

按我的理解是: 首先VControl是表示自定义了一个结构体类型,这个类型里面包含了三个变量,第一个是字符串指针,第二个是结构体指针,第三个是无类型指针; 其次采用这个类型申明了一个变量PhotoObjCtrl,也就是说程序中会使用PhotoObjCtrl这个变量; 最后你问的这个struct _V _VControl *pParent 是指这个变量里面又包含了一个结构体指针变量,这个指针同样指向自己定义的这三个变量类型; 总之整个全是操作结构体指 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

159

主题

965

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2014-3-7
在线时间
489 小时
发表于 2018-9-20 08:49:24 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-9-20 08:51 编辑

[/mw_shl_code][mw_shl_code=c,true]创建链表
typedef struct student{
        int score;
        struct student *next;
} LinkList;


初始化一个链表,n为链表节点个数。
LinkList *creat(int n){
        LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
        head = malloc(sizeof(LinkList));//分配地址
        end = head;         //若是空链表则头尾节点一样
        for (int i = 0; i < n; i++) {
                node = malloc(sizeof(LinkList));
                scanf("%d", &node->score);
                end->next = node;
                end = node;
        }
        end->next = NULL;//结束创建
        return head;
}[/mw_shl_code]



[mw_shl_code=c,true]修改链表节点值
修改链表节点值很简单。下面是一个传入链表和要修改的节点,来修改值的函数。
  1. void change(LinkList *list,int n) {//n为第n个节点
  2.         LinkList *t = list;
  3.         int i = 0;
  4.         while (i < n && t != NULL) {
  5.                 t = t->next;
  6.                 i++;
  7.         }
  8.         if (t != NULL) {
  9.                 puts("输入要修改的值");
  10.                 scanf("%d", &t->score);
  11.         }
  12.         else {
  13.                 puts("节点不存在");
  14.         }
  15. }
删除链表节点

删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点。即:p->next = q->next;然后放出q节点的空间,即free(q);
  1. void delet(LinkList *list, int n) {
  2.         LinkList *t = list, *in;
  3.         int i = 0;
  4.         while (i < n && t != NULL) {
  5.                 in = t;
  6.                 t = t->next;
  7.                 i++;
  8.         }
  9.         if (t != NULL) {
  10.                 in->next = t->next;
  11.                 free(t);
  12.         }
  13.         else {
  14.                 puts("节点不存在");
  15.         }
  16. }

插入链表节点

我们可以看出来,插入节点就是用插入前节点的指针域链接上插入节点的数据域,再把插入节点的指针域链接上插入后节点的数据域。根据图,插入节点也就是:head->next = e->next;  head->next = e;
增加链表节点用到了两个结构体指针和一个int数据。
  1. void insert(LinkList *list, int n) {
  2.         LinkList *t = list, *in;
  3.         int i = 0;
  4.         while (i < n && t != NULL) {
  5.                 t = t->next;
  6.                 i++;
  7.         }
  8.         if (t != NULL) {
  9.                 in = malloc(sizeof(LinkList));
  10.                 puts("输入要插入的值");
  11.                 scanf("%d", &in->score);
  12.                 in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
  13.                 t->next = in;//填充t节点的指针域,把t的指针域重新指向in
  14.         }
  15.         else {
  16.                 puts("节点不存在");
  17.         }
  18. }
输出链表
输出链表很简单,边遍历边输出就行了。
  1.         while (h->next != NULL) {
  2.                 h = h->next;
  3.                 printf("%d  ", h->score);
  4.         }
[/mw_shl_code]
回复

使用道具 举报

1

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2866
金钱
2866
注册时间
2018-1-24
在线时间
256 小时
发表于 2018-9-19 15:59:52 | 显示全部楼层
按我的理解是:

首先VControl是表示自定义了一个结构体类型,这个类型里面包含了三个变量,第一个是字符串指针,第二个是结构体指针,第三个是无类型指针;

其次采用这个类型申明了一个变量PhotoObjCtrl,也就是说程序中会使用PhotoObjCtrl这个变量;

最后你问的这个struct _V _VControl *pParent 是指这个变量里面又包含了一个结构体指针变量,这个指针同样指向自己定义的这三个变量类型;

总之整个全是操作结构体指针变量的变量,变量名不能弄错了,什么时候该用“->”,什么时候该用“.”必须搞清楚。
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2018-9-19 16:58:55 | 显示全部楼层
struct _VControl *pParent;, 或可以理解为指向上一级同类型的指针
回复

使用道具 举报

7

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2017-3-26
在线时间
65 小时
 楼主| 发表于 2018-9-19 17:44:16 | 显示全部楼层
bebj2009 发表于 2018-9-19 16:44
按我的理解是:

首先VControl是表示自定义了一个结构体类型,这个类型里面包含了三个变量,第一个是字符 ...

感觉有道理
回复

使用道具 举报

7

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2017-3-26
在线时间
65 小时
 楼主| 发表于 2018-9-19 17:45:48 | 显示全部楼层

有点像递归函数
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-19 17:57:32 | 显示全部楼层
小见多怪啰,C语言实现链表都是这样弄的
回复

使用道具 举报

7

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2017-3-26
在线时间
65 小时
 楼主| 发表于 2018-9-20 09:18:30 | 显示全部楼层
ssssssssssss 发表于 2018-9-20 08:49
[/mw_shl_code][mw_shl_code=c,true]创建链表
typedef struct student{
        int score;

学习了
回复

使用道具 举报

7

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2017-3-26
在线时间
65 小时
 楼主| 发表于 2018-9-20 09:34:29 | 显示全部楼层
ssssssssssss 发表于 2018-9-20 08:49
[/mw_shl_code][mw_shl_code=c,true]创建链表
typedef struct student{
        int score;

还有个程序问题:  Vconcrol* pobj; 程序中定义了一个这样的变量,他是结构体名紧跟着*符号,再加空格和变量名,这样的定义和  Vconcrol *pobj;定义是一样的吗?
回复

使用道具 举报

159

主题

965

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2014-3-7
在线时间
489 小时
发表于 2018-9-20 15:06:02 | 显示全部楼层
学海无涯xy 发表于 2018-9-20 09:34
还有个程序问题:  Vconcrol* pobj; 程序中定义了一个这样的变量,他是结构体名紧跟着*符号,再加空格和变 ...

不确定,我现在的理解是一样的
回复

使用道具 举报

2

主题

258

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2018-10-10 23:43:05 | 显示全部楼层

这个不是递归,这个只是一个指针,指向一个和自己结构一样的内存,是结构一样,而不是自己,,指针定义类型只是为了加一的时候实际地址增加多少。你这个是一个链表,通过指针把一个个相同结构不同地址的内存串起来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-16 22:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表