ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

初学链表知识

初学链表知识 链表定义点号和箭头NULL 是干什么的头节点添加元素tail 尾指针遍历打印定义定义数组是一块连续的内存元素挨着放。链表不是它的每个元素散落在内存各处靠指针把它们串起来链表里的每个元素叫节点,一个节点存两样东西自己的数据和下一个节点的地址structNode{intdata;Node*next;};data是数据next是下一个节点在哪。就这么简单点号和箭头左边是指针就用-左边是节点本身就用.head.data// head 是节点本身用点head.next-data// head.next 是地址用箭头head.next-data的意思是先跟着head.next存的地址找过去再取那个节点上的data-就是(*指针).成员的简写NULL 是干什么的链表最后一个节点的next要设成NULLhead.nextNULL;NULL的意思是后面没有了这个是必须写的。因为遍历链表的时候程序就是靠什么时候遇到 NULL来判断有没有走到尾巴Node*temphead;while(temp-next!NULL){temptemp-next;}只要temp-next还不是 NULL就说明后面还有人继续往后走。走到 NULL 就停下来此时temp就是最后一个节点头节点Node head;intsize0;head.nextNULL;这里head写成了节点实体不是指针所以它固定在栈上是链表的第一个节点也是唯一的入口这样写的好处是访问方便代价是链表至少会有一个节点没法表示空链表所以需要额外用一个size记录实际存了几个元素添加元素添加要分两种情况情况一链表还是空的size 0head.datadata;tailhead;size;数据直接存进head因为它本身就是第一个节点不需要额外申请内存情况二链表里已经有数据了Node*node(Node*)malloc(sizeof(Node));node-nextNULL;node-datadata;tail-nextnode;tailtail-next;这里malloc是向系统申请一块新内存用来放新节点。后面四行的作用下面单独讲tail 尾指针如果不记录尾节点每次添加都得从头开始找Node*temphead;while(temp-next!NULL){temptemp-next;// 一直走到最后一个}temp-nextnode;能找到末尾功能没问题。但元素越多走得越久每加一个就要遍历整条链表tail就是用来省掉这一步的用一个指针直接记住最后一个节点在哪添加时一步挂上去tail 必须先赋值Node*tail;tailhead;这两行缺一不可Node *tail;只是声明了一个能存地址的变量里面并没有有效地址装的是内存里残留的数据。这时候如果去写tail-next NULL;程序会拿着那个随机数据当地址用访问的内存不属于这个程序直接崩溃所以声明之后必须立刻给它一个真实地址tailhead;head是取 head 的地址。刚建好的链表只有 head 一个节点让 tail 指向它tail-next就等同于head.next可以安全使用了三行代码的作用node-nextNULL;tail-nextnode;tailtail-next;node-next NULL给新节点的next赋 NULL因为新节点是最后一个它后面没有节点了tail-next node让原来的尾节点指向新节点。这一步是真正把它接进链表tail tail-next把tail挪到新的末尾上遍历打印Node*temphead;while(temp-next!NULL){printf(%d,,temp-data);temptemp-next;}printf(%d,,temp-data);printf(\n);循环里打印的是当前节点的数据然后往后挪注意循环外面还要单独打印一次。因为循环结束时temp停在最后一个节点上它的数据还没打出来。
返回列表