[应用相关] 指针玩链表

[复制链接]
741|2
 楼主| xinxianshi 发表于 2021-7-5 09:54 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. //定义结构体类型,并给该结构体类型起个新名字All,注意有符号变量的位宽,以及最高位用来表示正负。
  4. typedef struct
  5. {
  6.     int i;
  7.     int j[3];
  8.     int k1:3;
  9.     int k2:5;
  10.     float m;
  11. } All;
  12. //定义结构体类型J
  13. struct J
  14. {
  15.      unsigned int j1:4;
  16.      unsigned int j2:4;
  17.      unsigned int j3:4;
  18.      unsigned int j4:4;
  19. };
  20. //定义联合体变量 bk,里面包含1个变量i和一个结构体类型为J的结构体变量j
  21. union
  22. {
  23.     unsigned int i;
  24.     struct J j;

  25. } bk;

  26. void bill( All *pii)
  27.     {
  28.         pii->i=12;
  29.         pii->j[2]=34;
  30.         pii->k1=2;
  31.         pii->k2=3;
  32.         pii->m=3.21;
  33.     }
  34. //定义一个链表结构体,包含向前的指针、存储的数字、向后的指针,指针指向的类型为自身
  35. struct Link
  36. {
  37.     struct Link *pre;
  38.     int mm;
  39.     struct Link *nex;
  40. };

  41. int main()
  42. {
  43.     All axx;

  44.     axx.i=5;
  45.     axx.j[0]=8;
  46.     axx.k1=-1;
  47.     axx.k2=15;
  48.     axx.m=1.32;
  49.     printf("Hello world!\n");
  50.     printf("axx.i=   %d\n",axx.i);
  51.     printf("axx.j[0]=%d\n",axx.j[0]);
  52.     printf("axx.k1=  %d\n",axx.k1);
  53.     printf("axx.k2=  %d\n",axx.k2);
  54.     printf("axx.m=   %f\n",axx.m);

  55.     printf("--------------------------------------------------------\n");
  56.     bill(&axx);

  57.     printf("axx.i=   %d\n",axx.i);
  58.     printf("axx.j[0]=%d\n",axx.j[0]);
  59.     printf("axx.k1=  %d\n",axx.k1);
  60.     printf("axx.k2=  %d\n",axx.k2);
  61.     printf("axx.m=   %f\n",axx.m);
  62.     printf("--------------------------------------------------------\n");

  63.     bk.i=0x1234;
  64.     printf("bk.j.j1=%d\n",bk.j.j1);
  65.     printf("bk.j.j2=%d\n",bk.j.j2);
  66.     printf("bk.j.j3=%d\n",bk.j.j3);
  67.     printf("bk.j.j4=%d\n",bk.j.j4);
  68.     printf("--------------------------------------------------------链表测试\n");
  69. //定义三个结构体类型为Link的结构体变量,并对结构体的数值变量赋值,然后将3个结构体变量通过内部指针首尾相连互相咬合组成环状
  70.     struct Link link1,link2,link3;
  71.     link1.mm=11;
  72.     link2.mm=22;
  73.     link3.mm=33;
  74.     link1.nex=&link2;
  75.     link2.nex=&link3;
  76.     link3.nex=&link1;
  77.     link1.pre=&link3;
  78.     link2.pre=&link1;
  79.     link3.pre=&link2;
  80. //通过当前结构体变量的向后指针读取指向的下一个结构体内的变量
  81.     printf("link1.nex-->%d\n",link1.nex->mm);
  82.     printf("link2.nex-->%d\n",link2.nex->mm);
  83.     printf("link3.nex-->%d\n",link3.nex->mm);
  84.     printf("---------------------------------------------\n");
  85. //通过当前结构体变量的向前指针读取指向的上一个结构体内的变量
  86.     printf("link1.pre-->%d\n",link1.pre->mm);
  87.     printf("link2.pre-->%d\n",link2.pre->mm);
  88.     printf("link3.pre-->%d\n",link3.pre->mm);

  89.     return 0;
  90. }
以前经常糊里糊涂的,现在明白了,变量成员的用.通过指针寻址的成员用箭头。
 楼主| xinxianshi 发表于 2021-7-5 09:57 | 显示全部楼层
做链表就是定义的链表可以嵌套包含本链表类型的指针。之前这个没想明白,现在懂了。
 楼主| xinxianshi 发表于 2021-7-5 09:58 | 显示全部楼层
这个例子还有段位,通过联合体,我们可以操作一个变量,就引起其他不完整变量(段位)的改变,这在很多单片机编程中经常用到,比如从一个寄存器读取某几个位的内容。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部