链表原理

来源:互联网 发布:淘宝售后是什么 编辑:程序博客网 时间:2024/05/17 02:58

1 、链式存储概念

(1)顺序存储:

我们所学的数组是一种连续的顺序存储方式,知道了数组某一个元素的地址,由于连续,则可以通过地址的计算能够算出每一个元素的地址。

(2)链式存储:

该方式是每个单元的存储位置是不连续的,随机的,但是可以通过在前一个存储单元中记录下一个存储单元的地址来把所有的存储单元联系起来,就像生活中的链条一样一环套一环,每个存储单元我们叫做节点。

每个节点可以分为两部分,数据域和地址域,数据域用来存储相关数据,地址域用来存储下一个节点的地址

如下图:



节点1 地址为 0x90, 存储数据1;

节点2 地址为 0x20,存储数据2;

节点3 地址为 0x40,存储数据3;

节点4 地址为 0x70,存储数据4;

通过节点1可以找到节点2的地址,找到节点2的地址就能找到节点3的地址,从而找到节点4的地址,这样逻辑上的链表就建成了。

2、代码实现模型

(1) 建立模型一

首先定义结构体s_node ,成员有两个,一个用来存放数据,一个用来存放地址。

tyepdef struct node{int  data;struct node* next;}s_node;

int main(int argc,char* argv[]){s_node node1,node2,node3,node4;node1.next = &node2;node2.next = &node3;node3.next = &node4;node4.next = NULL;return 0;}

如上代码其实已经建立了一个链表,每个节点的内存在栈中,如果知道了node1的地址,那么我就可以起知道其他几个节点的地址,从而访问所有的节点。


int i = 0;s_node *p = &node1;for(i = 0;i<4;i++){p->data = i;p = p->next;}

内存图如下:



(2)建立模型二

所有节点的内存从堆中分配出来,并建立起联系:

int main(int argc,char* argv[]){s_node *p1,*p2,*p3,*p4;p1 = (s_node*)malloc(sizeof(s_node));p2 = (s_node*)malloc(sizeof(s_node));p3 = (s_node*)malloc(sizeof(s_node));p4 = (s_node*)malloc(sizeof(s_node));/*假定malloc都申请成功*/p1->next = p2;p2->next = p3;p3->next = p4;p4->next = NULL;        //退出前注意freereturn 0;}

访问如下:

int i = 0;s_node *p = p1;for(i = 0;i<4;i++){p->data = i;p = p->next;}

内存图如下:



(3)删除模型

   以 建立模型二 为基础,目前有4个指针变量 p1  p2  p3  p4分别存储了节点1、2、3、4的地址,每个节点都是从堆区分配出来的。

   如果要释放掉节点2,并且要保证删除节点2后链表还是完整的,那么就要把节点1 与 节点3 连接起来,反应到代码就是节点1的 next 成员变量要存储节点3的地址:

  
p1->next = p3;free(p2);

在链表中删除某个节点需要能够访问这个节点的前一个节点。




 

0 0
原创粉丝点击