C_链表(单链表基本功能实现)

单链表结构体指针版本

介绍

本文采用结构体构造了基本的单链表(Linked_List);具有 增 删 改 查 释放 打印功能
PS:如果想在 删除功能 and 更改功能里面实现调用查找功能,需要使用结构体本身,不是用结构体指针进行传参,结构体指针传参修改不了值

图一
在这里插入图片描述
图二在这里插入图片描述

源码

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

typedef struct Linked_List
{
	int data;
	Linked_List* naxt;
}NODE,*PNODE;
//初始化方法一:
void Init_Linked_List_1(PNODE *top)
{
	(*top) = (PNODE)malloc(sizeof(NODE));
	(*top)->naxt = NULL;
}
//初始化方法二
PNODE Init_Linked_List_2()
{
	PNODE p = (PNODE)malloc(sizeof(NODE));
	p->naxt = NULL;
	return p;
}
/***************************************插入***************************************/
//头部插入方法:(PS:详解看图一)
void Top_insert(PNODE top, int data)
{
	//初始化;申请一个节点空间
	PNODE p = (PNODE)malloc(sizeof(NODE));
	p->data = data;
	p->naxt = NULL;

	//新申请的p->naxt指向原Top.naxt所记录的数据
	p->naxt = top->naxt;
	//将Top.naxt记录新申请的节点地址 p
	top->naxt = p;
}
//尾部插入方法:(PS:详解看图二)
void End_insert(PNODE top, int data)
{
	//初始化;申请一个节点空间
	PNODE p = (PNODE)malloc(sizeof(NODE));
	p->data = data;
	p->naxt = NULL;

	PNODE temp=top;//用一个临时变量记录开头
	//循环判断temp->naxt记录的是不是NULL;
	while (temp->naxt != NULL)
	{
		//不满足条件则记录下一个节点地址
		temp = temp->naxt;
	}
	//条件满足后将temp->naxt记录新节点 p
	temp->naxt = p;
}
/***************************************查找***************************************/
//查找方法一:
void find_Linlist_1(PNODE top, int data)
{
	//定义一个变量记录第二个节点位置
	PNODE temp = top->naxt;
	while (temp != NULL)//循环判断temp->naxt记录的是不是NULL;
	{
		if (temp->data == data)//判断查找是否匹配
		{
			printf("查找成功\n");
		}
		//temp->naxt没有遍历到NULL前,赋值下一个节点地址到temp
		temp = temp->naxt;
	}
}
//查找方法二:
void find_Linlist_2(PNODE top, int data)
{
	//定义一个变量记录top(第一个节点)
	PNODE temp = top;
	int i = 0;
	while (temp->naxt != NULL)//循环判断temp->naxt记录的是不是NULL;
	{
		//从第二个节点寻找到匹配的data插入
		if (temp->naxt->data == data)
		{
			printf("查找完毕:第%d个节点\n", i);
		}
		i++;
		//temp->naxt没有遍历到NULL前,赋值下一个节点地址到temp
		temp = temp->naxt;
	}
}
/***************************************修改***************************************/
//修改值
void change_Linlist(PNODE top, int data, int newdata)//修改
{
	//查找
	PNODE temp = top->naxt;//因为第一个节点没有数据,temp从第二个节点开始查找
	while (temp != NULL)
	{
		if (temp->data == data)//判断查找是否匹配
		{
			//数据匹配语句
			temp->data = newdata;
		}
		temp = temp->naxt;
	}
}
/***************************************删除***************************************/
//删除值
void dele_Linlist(PNODE top, int data)//删除:有三个节点 A,B,C(要删除的B节点);
{
	PNODE p = top;
	while (p->naxt != NULL)
	{
		if (p->naxt->data == data)
		{
			//定义一个临时变量存储被删除值
			PNODE temp = p->naxt;
			p->naxt = p->naxt->naxt;
			free(temp);//释放被删除值
		}
		p = p->naxt;
	}

}
/***************************************释放***************************************/
//释放链表
void deleAll_Linlist(PNODE top)//释放链表
{
	PNODE temp;//临时指针
	while (top != NULL)
	{
		//只要top不等于NULL,就一直释放
		temp = top;//while循环赋值指针节点
		top = top->naxt;//指向下一个节点地址
		free(temp);//释放节点
	}
}
/***************************************打印***************************************/
void print_Linlist(PNODE top)
{
	//定义一个变量记录top(第一个节点)
	PNODE temp = top->naxt;
	//循环判断temp->naxt记录的是不是NULL;
	while (temp != NULL)
	{
		printf("%d->", temp->data);
		temp = temp->naxt;
	}
	printf("NULL\n");
}
void main()
{
    /***************************************初始化***************************************/
	PNODE list;
	Init_Linked_List_1(&list);
	Init_Linked_List_2();
	/***************************************插入值***************************************/
	for (int i = 0; i < 10; i++){
		End_insert(list, i);
	}
	/***************************************查找值***************************************/
	find_Linlist_1(list, 2);
	find_Linlist_2(list, 5);
	/***************************************修改值***************************************/
	change_Linlist(list, 1, 3);
	/***************************************删除值***************************************/
	dele_Linlist(list, 2);
	/***************************************打印值***************************************/
	print_Linlist(list);
	/***************************************释放值***************************************/
	deleAll_Linlist(list);
	system("pause");
}

运行结果

在这里插入图片描述

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值