打印
[应用相关]

指针玩链表

[复制链接]
600|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinxianshi|  楼主 | 2021-7-5 09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <stdlib.h>

//定义结构体类型,并给该结构体类型起个新名字All,注意有符号变量的位宽,以及最高位用来表示正负。
typedef struct
{
    int i;
    int j[3];
    int k1:3;
    int k2:5;
    float m;
} All;
//定义结构体类型J
struct J
{
     unsigned int j1:4;
     unsigned int j2:4;
     unsigned int j3:4;
     unsigned int j4:4;
};
//定义联合体变量 bk,里面包含1个变量i和一个结构体类型为J的结构体变量j
union
{
    unsigned int i;
    struct J j;

} bk;

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

int main()
{
    All axx;

    axx.i=5;
    axx.j[0]=8;
    axx.k1=-1;
    axx.k2=15;
    axx.m=1.32;
    printf("Hello world!\n");
    printf("axx.i=   %d\n",axx.i);
    printf("axx.j[0]=%d\n",axx.j[0]);
    printf("axx.k1=  %d\n",axx.k1);
    printf("axx.k2=  %d\n",axx.k2);
    printf("axx.m=   %f\n",axx.m);

    printf("--------------------------------------------------------\n");
    bill(&axx);

    printf("axx.i=   %d\n",axx.i);
    printf("axx.j[0]=%d\n",axx.j[0]);
    printf("axx.k1=  %d\n",axx.k1);
    printf("axx.k2=  %d\n",axx.k2);
    printf("axx.m=   %f\n",axx.m);
    printf("--------------------------------------------------------\n");

    bk.i=0x1234;
    printf("bk.j.j1=%d\n",bk.j.j1);
    printf("bk.j.j2=%d\n",bk.j.j2);
    printf("bk.j.j3=%d\n",bk.j.j3);
    printf("bk.j.j4=%d\n",bk.j.j4);
    printf("--------------------------------------------------------链表测试\n");
//定义三个结构体类型为Link的结构体变量,并对结构体的数值变量赋值,然后将3个结构体变量通过内部指针首尾相连互相咬合组成环状
    struct Link link1,link2,link3;
    link1.mm=11;
    link2.mm=22;
    link3.mm=33;
    link1.nex=&link2;
    link2.nex=&link3;
    link3.nex=&link1;
    link1.pre=&link3;
    link2.pre=&link1;
    link3.pre=&link2;
//通过当前结构体变量的向后指针读取指向的下一个结构体内的变量
    printf("link1.nex-->%d\n",link1.nex->mm);
    printf("link2.nex-->%d\n",link2.nex->mm);
    printf("link3.nex-->%d\n",link3.nex->mm);
    printf("---------------------------------------------\n");
//通过当前结构体变量的向前指针读取指向的上一个结构体内的变量
    printf("link1.pre-->%d\n",link1.pre->mm);
    printf("link2.pre-->%d\n",link2.pre->mm);
    printf("link3.pre-->%d\n",link3.pre->mm);

    return 0;
}
以前经常糊里糊涂的,现在明白了,变量成员的用.通过指针寻址的成员用箭头。

使用特权

评论回复
沙发
xinxianshi|  楼主 | 2021-7-5 09:57 | 只看该作者
做链表就是定义的链表可以嵌套包含本链表类型的指针。之前这个没想明白,现在懂了。

使用特权

评论回复
板凳
xinxianshi|  楼主 | 2021-7-5 09:58 | 只看该作者
这个例子还有段位,通过联合体,我们可以操作一个变量,就引起其他不完整变量(段位)的改变,这在很多单片机编程中经常用到,比如从一个寄存器读取某几个位的内容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

890

帖子

1

粉丝