基于结构体的结构体指针的讲解以及链表的简述

基于结构体的结构体指针的讲解以及链表的简述

  #include<stdio.h>
  struct Node{
      int value;
      Node *p;
  };
  int main(){
      Node a,b;
      a.value=213;
      b.value=2333;
      a.p=&b;
      a.p->value=1212;
      printf("b.value=%d",b.value);
      getchar();
      return 0;
  }

对于此代码首先定义了一个结构体Node,其内包含一个int类型的value属性以及一个暂时不知道指向谁的Node类型的一级指针,主要注意该以及指针在main函数中为将定义的一个struct类型的b的地址赋值给该指针,注意在Node结构体内对于指针p的类型也是Node类型但是调用该指针的有关Node类型的struct结构体时必须用->来实现。于是便如上方代码所见,指针p所指向的node类型即为b当用->来调用p的value以及p属性时调用的就是b的属性,且对二者一个修改另一个也会随之修改,故而此代码的结果为b.value=1212;即通过将Node类型的指针的->value属性值改为1212来实现对于其指向的Node类型b的value属性改变。

  
  #include<stdio.h>
  struct Date{
      int width;
      int height;
      int weight;
  };
  Date local={50,66,20};
  struct Test{
       Date *tx;
       Date rx;
  };
  Test st={&local,{0}};
  int main(){
      int buf1,buf2;
      buf1=st.rx.width;
      buf2=st.tx->width;
      printf("buf1=%d\n",buf1);
      printf("buf2=%d\n",buf2);
      return 0;
  }

继续对于->以及结构体指针的讲解,首先定义了一个Date结构体其内包含三个int类型的属性,之后定义了一个Date类型的对象且进行了初始化令它的三个属性值分别为50,66与20.之后又定义了一个Test结构体,其内包含两个属性一个是Date类型的rx属性,另一个是Date类型的tx一级指针。之后又定义了一个Test类型的st对象并进行了初始化,将local的地址赋给st的Data类型的一级指针tx属性,将0赋值给st的Data类型的rx属性这样对于rx来说其作为Data结构体的三个属性将全部为0;对于main函数,输出对于buf1=st.rx.width;为直接将st对象的rx属性的width属性赋值给buf1之前已经将rx属性的所有属性值均指定为0故而buf1的值即为0;而对于buf2=st.tx->width;首先st.tx首先调用了Test类型的st对象的一级指针tx,之后由于该指针还是Data类型当调用其作为Data类型的属性是要使用"->"来实现,而之前已经local的地址赋值给了该指针故而调用st.tx->width;就是调用local.width的值(50)赋值给buf2属性,故而打印结果分别为0和50;

  
  #include<stdio.h>
  struct Date{
      int width;
      int height;
      int weight;
  };
  Date local={50,66,20};
  struct Test{
       int *tx;
       Date rx;
  };
  Test st={&(local.width),{0}};
  int main(){
      int buf1,buf2;
      buf1=st.rx.width;
      buf2=*(st.tx);
      printf("buf1=%d\n",buf1);
      printf("buf2=%d\n",buf2);
      return 0;
  }

对于上方代码进行修改:将Test结构体内的一级指针tx的类型设置为int类型,故而此时st赋初值的代码改为:Test st={&(local.width),{0}};直接将local的width属性的地址给该tx指针,而调用tx指针指向的值的时候要用*来进行解析,虽然进行了修改但是两个代码块结果一致。

此部分也指明了可以用{}对结构体对象进行初始化而并非要一个语句一个语句的进行赋值来实现初始化。

  
  #include<stdio.h>
  #include<stdlib.h>
  #include<malloc.h>
  struct node{
      int value;
      node *next;
  };
  int main(){
      node* head=(node*)malloc(sizeof(node));
      node* flag=head;
      scanf("%d",&flag->value);
      while(flag->value!=0){
          flag->next=(node*)malloc(sizeof(node));
          flag=flag->next;
          scanf("%d",&flag->value);
      }
      flag->next=NULL;
      flag=head;
      while(flag!=NULL){
          printf("%d\t",flag->value);
          flag=flag->next;
      }
      getchar();
      return 0;
  }

此为单链表如何建立以及将数值输入各个节点并打印出来,涉及到头结点head的建立以及递归的不断搜索整个链表将各个节点的值输出打印。首先定义了一个Node结构体其中包含数值属性以及用来指向链表中下一个节点Node的一级指针next,在main()函数中首先node* head=(node*)malloc(sizeof(node));为node类型的指针head建立一个空间,称为头结点在单链表中只能通过头结点来从头到尾的搜索数据,所以不能够丢失头节点故而将头结点的相关信息(此时为代表一个新建的节点)赋值给新建的一个flag结点同时传递过去的还有head节点存储的地址信息,之后先对flag节点的value属性进行scanf赋值操作,此时同时改变的也有head属性因为二者存储地址是一样的。之后利用while循环只要输入的数据不是0就一直循环下去,对于value内部首先为flag->next指针分配一个空间此时为一个空的结点,将此空节点覆盖给flag指针,即为令flag指向下一个结点之后再将value属性进行填写,不断重复即可完成链表的填写。注意当输入值为0时要令flag->next=NULL;表示单链表已经达到尾结点因此其下一个节点为空。

对于之前设定的head头结点一直没有改变仍然为单链表首个结点,因此可以将其信息赋值给flag指针再次利用flag指针遍历整个单链表将所有的结点值输出打印出来,同样也是利用while循环来进行遍历直到flag->next=NULL;时结束遍历,此时已将所有的信息打印出来,结束代码块。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光的样子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值