【链 表】

目录

链表

结点:

首元结点:

头结点:

链表的结构示意图:

 功能实现

创建链表

增加元素

输出元素

修改元素

查找元素

删除元素

释放所有结点

主函数调用


链表

链表是数据结构中线性表的一种,其中每个元素实际上是一个单独的结构体对象,而所有对象都通过每个元素中的指针链接在一起

结点:

链表中每个结构体对象叫做结点。

首元结点:

第一个数据结点。

头结点:

如果第一个结点不用于存储数据,只用于代表链表的起始点,则这个结点称为链表的头结点。

     指针域:保存下一个结点的地址 

最后一个指针域指向NULL

链表的结构示意图:

 功能实现

创建链表

//声明一个结构体类型,作为结点的类型
typedef struct node
{
	int id;//数据域
	struct node* next;//指针域
}NODE;
//申请一个头结点让head只想这个结点

NODE* init()
{
	NODE* temp = (NODE*)malloc(sizeof(NODE));
	temp->id = 0;
	temp->next = NULL;
	return temp;
}

增加元素

//增加元素 头插法

void insert(NODE*head,int data)//接收主函数的head值
{
	//申请一片新的内存,作为新结点S的存储空间
	NODE* S = (NODE*)malloc(sizeof(NODE));
	//保存数据
	S->id = data;
	//结点S连接到单链表中,并成为新的首元结点
	S->next = head->next;
	head->next = S;
}

输出元素

//输出元素

void print(NODE*head)
{
	if (head == NULL)
	{
		printf("单链表为空");
		return;
	}
	NODE* p = head->next;//p指向首元结点
	
	while (p != NULL)
	{
		printf("%d ", p->id);
		p = p->next;
	}
	printf("\n");
}

修改元素

//修改元素

void change(NODE*head,int val,int data)
{
	NODE* p = head->next;
	while (p != NULL)
	{
		if (p->id == val)
		{
			p->id = data;
		}
		p = p->next;
	}
}

查找元素

//查找元素

void find(NODE* head, int val) 
{
	NODE* p = head->next;
	int flag = 0;//标记p指向首元结点的位置
	while (p != NULL)
	{
		flag++;
		if (p->id == val)
		{
			printf("%d的位置是%d  ", p->id, flag);
		}
		p = p->next;
	}
	printf("\n");
}

删除元素

删除元素

void delete(NODE* head, int val)
{
	NODE* p1 = head->next;
	NODE* p2 = head;
	while (p1 != NULL)
	{
		if (p1->id == val)
		{
			p2->next = p1->next;
			free(p1);
			p1 = p2->next;
		}
		else
		{
			p1 = p1->next;
			p2 = p2->next;
		}
	}
}

释放所有结点

//释放所有结点
void AllClean(NODE* *list)//要改变head的值
{
	NODE* p =(*list)->next;
	while (p != NULL)
	{
		(*list)->next = p->next;
		free(p);
		p = (*list)->next;
	}
	free(*list);
	*list = NULL;//让*list指向的为空,不可以是head,这个时候head已经被释放了
}

第二种方式他不会释放头结点所以不可取

//释放所有结点

void AllClean(NODE* head)
{
	NODE* p = head->next;
	while (p != NULL)
	{
		head->next = p->next;
		free(p);
		p = head->next;
	}
	free(head);
	head = NULL;//head清除了要用*list指向空
}

主函数调用

int main()
{
	NODE* head = NULL;//head指向头结点
	head = init();
	//printf("%p", head);

	//测试1-4
	//增加元素
	for (int i = 0; i < 4; i++)
	{
		insert(head, i + 1);
	}
	print(head);
	//修改元素
	change(head, 2, 4);
	print(head);
	//查找元素
	find(head, 4);
	//
	delete(head, 3);
	//
	print(head);
	//
	AllClean(&head);
	//AllClean(head);
	print(head);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨焰翎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值