C/链表,找到链表中间的节点

#include <stdio.h>
#include <stdlib.h>

//链表节点,可看成其中一个链表的一个节点
struct Node
{
int data;
struct Node* next;
};
//这里头结点一样包括数据
//打印中间节点的数据
void printMiddle(struct Node* head)
{
struct Node *slow_ptr=head;//慢指针每次移动指向一个节点
struct Node *fast_ptr=head;//快指针每次移动指向两个节点

if(head!=NULL)
{
while(fast_ptr->next)
{
fast_ptr=fast_ptr->next->next;
slow_ptr=slow_ptr->next;
//考虑到了偶数情况,取中间靠后的位置
}
}
}
//采用头插法
void push(struct Node **head_ref,int new_data)
{
//分配一个新节点来插入到前面来
struct Node *new_node=(struct Node*)malloc(sizeof(struct Node));
//放入数据
new_node->data=new_data;

//第一步,将新节点里面的指针部分指向头结点
new_node->next=*head_ref;
//第二步,头指针改为指向新建立的节点
*head_ref=new_node;
//这里的形参必须是**的形式,因为要改变地址的值,而不是地址指向的值
}

//打印链表
void printList(struct Node *ptr)
{
while(ptr!=NULL)
{
printf("%d ",ptr->data);
ptr=ptr->next;
}
printf("NULL\n");
}
//主函数,来测试上述函数
int main(void)
{
//先指定为空指针,防止变为野指针
struct Node* head=NULL;

for(int i=5;i>0;i--)
{
push(&head,i);
printList(head);
printMiddle(head);
}
return 0;
}

posted @   踏上星辰  阅读(156)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示