版权声明:本文为博主原创文章,未经博主允许不得转载。 /gaoapp/article/details/
最近温习了数据结构,感觉还是记一下比较好
简单的动态链表构建。在此之前还是说一个malloc与calloc函数区别吧。
其功能就是在内存动态存储区分配长度为size的连续空间,返回的是分配域的起始位置,如何调用该函数没有成功,比如空间不足等原因,返回的是空指针
calloc函数原型就是:
其功能就是在内存动态存储区分配n个长度为size的连续空间,返回的是分配域的起始位置,如何调用该函数没有成功,比如空间不足等原因,返回的是空指针
说到连续,这里需要额外说明,这里的连续是指每个结点的空间,并不是链表的全部元素都是连续的,数组结构才是连续的内存地址。所以一般来说遍历同样大小的数组和链表实际是数组要快些的,因为要考虑到CPU的空间局部性访问!
下面是该动态链表的基本操作代码(比较简单基础):
//链表指针如果把一个个结点(名叫List的结构体)当作一个单元,这就是指向该单元的指针 /*创建链表 这里需要注意最后一个加入的数字位于链表的开头(也就是说这里稍加处理就可以变成栈和队列了)*/ /*最简单的两个链表的操作*/ /*两个链表是否相等*/
另外你的还有一个问题,就是如果删除了第一个后,你没有更新p_start,这会导致你在最后输出的时候,第一个是错误的。不信你可以试一下。
1. 使用p_charu2保存当前节点的上一个节点,初始值为NULL,因为第一个节点没有上一个节点
在while循环中判断当前节点是否为NULL,如果不为NULL,判断当前节点的学好是否等于需要删除的学号,如果是,判断是否p_charu2是否为NULL,即是否为第一个节点,如果不是,则设置当前节点的上一个节点的下一个节点为当前节点的下一个节点,这里有点绕,比如节点1,2,3,删除2,则设置1(2的上一个节点)的下一个节点为3(2的下一个节点),如果p_charu2为NULL,则是第一个节点,这更新p_start为p_charu的下一个节点。然后释放当前节点
4.设置当前节点为当前节点的下一个节点,进入下一个循环
最后的输出部分也用while而没有固定节点个数,免得万一输入前面输入的不是3个,还需要更改这里的代码。下面的是完整代码