14_链表

知识点1【链表的插入】0-1
1、在链表的尾部插入在这里插入图片描述

//链表的尾部插入

STU* insert_link(STU *head, STU tmp)

{

	//1、申请待插入的节点

	STU *pi = (STU *)calloc(1,sizeof(STU));

	if(pi == NULL)

	{

		perror(calloc);

		return head;

	}


	//2、将tmp的数据 赋值到 *pi

	*pi = tmp;

	pi->next = NULL;


	//3、将节点插入到链表的尾部

	if(head == NULL)//链表不存在

	{

		head = pi;

		return head;

	}

	else//链表存在

	{

		//a、寻找链表的尾节点

		STU *pb = head;

		while(pb->next != NULL)//如果不是尾节点

			pb = pb->next;//pb就指向下一个节点


		//b、用尾结点 pb 链接上 插入的节点pi

		pb->next = pi;

		return head;

	}


	return head;

}

2、链表的有序插入(难度)0-2在这里插入图片描述

//链表的有序插入 以num的顺序为准(小--->大)

STU* insert_link(STU *head, STU tmp)

{

	//1、给待插入的节点pi 申请 堆区空间

	STU *pi = (STU *)calloc(1,sizeof(STU));

	if(pi == NULL)

	{

		perror("calloc");

		return head;

	}


	//2、将tmp的内容 赋值给 *pi

	*pi = tmp;

	pi->next = NULL;


	//3、链表节点pi的插入

	if(head == NULL)//链表不存在

	{

		head = pi;

		return head;

	}

	else//存在

	{

		//a、寻找插入点

		STU *pb = head, *pf = head;

		while(pb->num < pi->num && pb->next != NULL)

		{

			pf = pb;

			pb = pb->next;

		}


		//b、插入点的判断

		if(pb->num >= pi->num)//头部 中部插入

		{

			if(pb == head)//头部之前插入

			{

				pi->next = head;

				head = pi;

				return head;

			}

			else//中部插入

			{

				pf->next = pi;

				pi->next = pb;

				return head;

			}

		}

		else//尾部插入

		{

			pb->next = pi;

			return head;

		}

	}

	return head;

}

知识点2【链表查询某个节点】 按姓名 查找在这里插入图片描述

STU* search_link(STU *head, char *name)

{

	//1、判断链表是否存在

	if(head == NULL)//不存在

	{

		printf("link not found\n");

		return NULL;

	}

	else//链表存在

	{

		STU *pb = head;


		//逐个将节点中的name 和 name比较 如果不相等 pb=pb->next

		while(strcmp(pb->name,name)!=0 && pb->next != NULL)

			pb = pb->next;


		//判断是否找到

		if(strcmp(pb->name,name)==0)//找到

			return pb;

		else//没找到

			return NULL;

	}


	return NULL;

}

知识点3【删除链表指定节点】1-1在这里插入图片描述

STU* detele_link(STU *head,char *name)

{

	//1、判断链表是否存在

	if(head == NULL)//不存在

	{

		printf("link not found\n");

		return head;

	}

	else//存在

	{

		//2、寻找删除点

		STU *pf=head, *pb = head;

		while(strcmp(pb->name,name)!=0 && pb->next != NULL)

		{

			pf = pb;

			pb = pb->next;

		}


		//3、找到删除点

		if(strcmp(pb->name,name)==0)//找到删除点

		{

			//4、判断删除的位置

			if(pb == head)//删除头结点

			{

				head = pb->next;

				free(pb);

				

			}

			else//中部 或 尾部节点

			{

				pf->next = pb->next;

				free(pb);

			}

			printf("已成功删除%s的相关节点\n",name);

			return head;

		}

		else//没找到删除点

		{

			printf("链表中没有%s相关的数据节点信息\n",name);

		}

	}

	return head;

}

知识点4【链表的释放】

STU* free_link(STU *head)

{

	//判断链表是否存在

	if(head == NULL)

	{

		printf("link not found\n");

		return head;

	}

	else//链表存在

	{

		STU *pb = head;


		//逐个节点释放

		while(pb != NULL)

		{

			//head保存下一个节点的位置

			head = pb->next;

			//释放pb指向的节点

			free(pb);

			//pb 指向 head

			pb = head;

		}


		printf("链表已经释放完毕\n");

		return head;

	}


	return head;

}

回顾一下:
链表的插入:头部之前插入 尾部插入 有序插入
1、为插入的节点pi申请空间
2、将tmp的值赋值给*pi *pi = tmp
3、判断链表是否 存在
3-1:不存在 head = pi
3-2: 存在 (尾部插入 有序插入) 寻找插入点 安装具体的位置 插入节点
链表的遍历:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点遍历 注意 别越界。
链表的查询:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点比较 比较成功返回位置 注意 别越界。
链表节点的删除:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点比较 删除指定节点 注意 别越界。

释放链表:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点节点释放 注意 别越界

知识点5【链表的逆序】1-2在这里插入图片描述

STU* reverse_link(STU *head)

{

	//判断链表是否存在

	if(head == NULL)

	{

		printf("link not founf\n");

		return head;

	}

	else//链表存在

	{

		//int *p,num;//p为int * , num为int

		STU *pb,*pr;//pb为STU * , pr为STU *


		//pb保存head->next(原因head->next会置NULL)

		pb = head->next;

		//将head->next置NULL   (原因:头节点变尾节点)

		head->next = NULL;


		while(pb != NULL)

		{

			//pr保存pb->next  (原因:pb->next会指向head)

			pr = pb->next;


			//pb->next 指向 head (原因:逆转方向)

			pb->next = head;


			//保存 逆转方向的代码 可以重复 执行

			head = pb;

			pb = pr;

		}


		return head;

	}

	return head;

}

知识点6【链表的排序】
选择法排序:(以数组实现)在这里插入图片描述

#include<stdio.h>

int main()

{

	int arr[10]={0};

	int n = sizeof(arr)/sizeof(arr[0]);

	int i=0,j=0,min=0;

	

	printf("请输入%d个int数据\n",n);

	for(i=0;i<n;i++)

	{

		scanf("%d",arr+i);

	}

	

	//选择法排序

	for(i=0;i<n-1; i++)

	{

		for(min=i,j=min+1; j<n;j++)

		{

			if(arr[min] > arr[j])

				min = j;

		}

		

		if(min != i)

		{

			int tmp = 0;

			tmp = arr[i];

			arr[i]=arr[min];

			arr[min]=tmp;

		}


	}


	for(i=0;i<n;i++)

	{

		printf("%d ",arr[i]);

	}

	printf("\n");


	return 0;

}

运行结果:在这里插入图片描述选择法排序:(以链表实现)

发布了20 篇原创文章 · 获赞 0 · 访问量 33

猜你喜欢

转载自blog.csdn.net/weixin_45992045/article/details/104678981