链表创建,结构体指针


2017/8/22 勘误

    下面阐述中出现了一个错误,在基础准备知识中 第3点。红色重点 描述错误。

 首先,结构体指针赋值和普通指针赋值并没有区别。

指针在定义的时候,系统会分配一个4字节的空间(32位系统),任何类型的指针都是这样。这个空间用来存放一个地址值。

指针的类型是我们告诉编译器的,机器很傻,比如我们要使用指针指向的值,机器不知道目标地址后有多少个字节是我们

要使用的,这时候,就要靠指针的类型出马了。他会告诉cpu,我是int型,你给我往后面取4个字节。

指针在赋值的时候,比如  tail= pnew;如果不预先告诉你,这两个变量是指针,是不是就像普通的整型变量的赋值一样呢?

事实就是这样的,完全可以看做是int 型变量的赋值。

链表创建,结构体指针_第1张图片我的链表理解

表的创建是这样子的结构体
1. typedef struct _LINK_NODE  
2. {  
3.     int data;  
4.     struct _LINK_NODE* next;  
5. }LINK_NODE;
下面我就来谈一下我今天的一些理解                                                          
    LINK_NODE *head,*tail,*pnew;      
  基础准备知识:1、我们要理解结构体是一个  超级数组      
                                      功能比数组更强大,粗略上可以按照数组存放数据方式来类推   
                                 2、结构体指针是什么?比如 LINK_NODE *head,head里面存
                                      放的是结构体首地址,可以类比数组。
                                 3、结构体指针赋值怎么理解? 比如  tail = pnew; 解释起来就是
                                      将pnew内的所有 数据  赋值到 tail里。不是改变tail指向的地址。
                                      简单点说就是只是简单的数据复制粘贴。
  第一步 :创建链表头
           head = (struct student *)malloc(LEN);
              此时 head内存放的是 申请的内存的地址
                    head->next=NULL;
               tail = head;     
第二步:申请新的内存空间
                   pnew = (struct student *)malloc(LEN);
                   //存入数据
              pnew->next = NULL; 
               这是新申请的空间,将其next指空很容易理解,新创建的链后面肯定是空。
第三步:改上次尾部的指向                               
                tail->next = pnew;
         未赋值之前,tail->next 值为NULL,这是将新申请的空间串到尾部,理解起来很容易。到这里tail做为尾部使命已经结束,因为next已经有了指向,tail将会被赋予新值。
但是在内存中这个是什么样的操作困扰了我很久。下面我就来讲讲我的理解。
                首先,我们要知道next里面放的什么,next放的是下一个链的地址,
只是一个地址的值,用图来描述一下


addr 0x957110                addr 0x0095e838         addr 0x00957110
 data                           data                            data    
                                         

next addr                   next addr                     next addr
0x0095e838                0x00957110                   NULL

        用指针操作这个 next addr 就可以操作下一个链的数据
tail = pnew;
上一次的尾部更新为现在刚刚申请的链。

至此,在链尾加入新值完成。



你可能感兴趣的:(链表创建,结构体指针)