C->数据结构->链式结构

来源:互联网 发布:java最好的培训 编辑:程序博客网 时间:2024/05/17 22:46

本人是个新手,写写笔记。

如果那里有错误或者语言不妥的地方。

请给予斧正!

0x01简介

数据都会存放在彼此的独立的空间中

每一个空间,我们叫做节点

提问,我们该如何找到每一个节点呐?
每个节点都需要使用一个指针来记录下一个数据的位置


0x02小结

每一个节点需要两个必备的条件

1-> 存放节点的数据

2->记录下一个节点地址的指针

如果是最后一个节点,指针就是NULL空地址


大体就是这样的


0x03实现链式结构(创建/删除)

我们一般使用结构体来当做节点使用

  6 typedef struct {  7  int value; //存入节点的数据  8  struct neob *p_value; //指向下一个节点的地址指针  9 }neob;//节点名称
小技巧:
在创建一个链式结构的时候,最好在头节点添加一个空节点,有利于操作

neob f1;//创建一个空的头节点,名叫f1neob *p_value=&f1;//这里就是将指针指向节点

创建:

我们建立一个新的函数


代码:

95 void add_head(int value){//先把要存放的数据拿过来 96  noob* p_temp=p_head;//创建一个新的指针,指向头节点 97  noob* p_newneob=(neob *)malloc(sizeof(neob));//我们要创建就要在堆中申请一个新的结构体的内存空间 98  p_newneob->p_value=p_temp->p_value;//新申请的节点中的指针要指向当前节点的下一个节点的地址 99  p_newneob->value=value;//设置新的节点中的数据100  p_head->p_value=p_newneob;//将上一个节点的指针指向新创建的节点101 }


删除:


例如:

我们要删除中间的节点

条件:

要记住删除节点中指针指向的地址

再删除之前,就要复制被删除节点中的指针地址

之后,再将复制下来的指针地址赋值给前面的节点中的指针

在某种意义上讲,我们找不到第二个节点,也就是删除掉了

在删除的时候,要检测到被删除节点是否是最后一个节点

小知识:

这种删除方法很常见

就比如说,在格式化硬盘之后为什么还可以找到之前的数据

格式化并不是直接删除数据而是修改数据地址

所以在数据恢复中,要避免数据的重复擦写


删除节点的代码实例:

int dely(){neob *p_temp=p_f1->p_value;if(p_temp->p_value){//如果这个节点的指针不为空,就是说这个节点不是最后的节点while(p_temp->p_value->p_value){p_temp=p_temp->p_value;//向下寻找}free(p_temp->value);//释放p_temp->p_value=NULL;//设置空地址return 1;//返回1,表示删除成功}else{return 0;//失败}}

0x04插入节点

依然看下这个图


void gnew(int value){//要接收新节点的新数据  neob *p_temp=p_value;//获取头节点的地址  neob *p_neob=(neob* )malloc(sizeof(neob));//从堆中获取一个节点的空间,再将首地址交给p_neob指针  p_neob->value=value;//设置节点中的数据  p_neob->p_value=NULL;//不知道这个节点的前一个节点的指针是什么,所以先设为空地址  //要寻找,链式结构的最后一个节点的指针,然后再将指针指向p_neob->p_value  while(p_temp->p_value){//从头节点开始,一次寻找每个节点中地址是否为空,如果,找到空地址之后就代表是链式结构的最后一个节点就可以结束  p_temp=p_temp->p_value;//依次向后推  }  p_temp->p_value=p_neob;//找到最后一个节点,并挂上刚刚申请的节点地址}


























原创粉丝点击