C语言结构体实现线性链表

利用C语言的结构体和指针链表的相关知识,自己动手敲了下实现类似链表的功能。

创建方法

实现功能是接受用户输入链表长度,自动申请内存,创建节点,形成链表,并且把链表的头指针返回,供以后使用。

这边有一个循环去创建节点,实现一些赋值接受输入等操作。因为创建节点不能每次都从头结点一路找过去,所以创建一个尾节点,一直指向链表的最后,后面插入的时候每次只要挂到尾节点的后面就可以了。挂上一个节点之后再把为节点指向刚刚挂上的那个节点,这样每次新建节点就能很快的挂到链表上。

输出链表

输出链表是从头结点开始,一直移动指针,每次完成一个节点的内容之后,再讲p指向p->next,这样就能循环遍历所有的节点了。

插入节点

这个很容易想到就是先把中间要插入节点的index前一个节点找到,再将自己的p->next指向他的下个节点,再将index的前一个节点的的p->next指向新创建的节点,这样就在index位置插入了一个新建的节点。

while循环是将指针移动到index-1的位置,这样后面我们就能利用index-1的指针进行插入操作了。第二个是排除一些异常的情况,i>index-1 是防止用户误输入,比如链表长度是5,用户输入-1 的位置插入,这样会出现异常,所以加上判断条件,拦截异常。

删除元素

删除元素的和插入元素的代码看起来很相似,其实想想也能明白,删除index位置的节点,首先要找到index-1位置的节点,并改变p->next值,并且是指向下个元素的p->next,这样才能达到删除index位置节点的功能。


判断条件和循环条件都一样,*val是返回出去的删除的节点的value值。

反转单链表

单链表反转,思路是取俩个指针,分别指向头指针和和首指针,将首指针的pNext指向头指针,循环直到第二个指针为空即到链表的尾部停止,循环的过程中不断的移动这俩个指针,并且改变指针的pNext。


循环完成之后,链表的状态应该是之前的头指针变成了尾指针,之前的尾指针变成了第一个指针,但是里面没有值,移除并释放这个节点,创建新的头结点,并指向反转过的链表的第一个节点,最后返回newHead.

推荐阅读更多精彩内容