9.25小结(单链表和循环单链表)

冒泡排序算法

核心思想:

1、几个元素排序?
2、需要排序几轮?
3、每轮比较交换次数?

例子分析:

10个元素
排序9轮
每轮比较交换次数 = 未完成排序的元素个数 - 轮数
第一轮 比较 9次 结果:最大的元素排在最后
第二轮 比较 8次 结果:最大的元素排在倒数第二
。。。
第九轮 比较 1次 结果:最大的元素排在倒数第第九
4、比较
if(after->data data)
{
int num = after->data;
after->data = before->data;
before->data = num;
}
5、链表中元素个数:n = show_linklistnode();
6、用什么方式体现轮数 for(i = 1; i < n-1 ;i++)
7、每一轮比较多少次 for(j = 1; j < n-1-i; j++)

单链表冒泡排序代码:

void bullesort_linklist(node_t *head)
{
	//1、参数判断
	if(NULL == head ||head->next == NULL)
	{
		perror ("parameters is illegal\n");
		return;
	}
	//2、几个元素
	int num = show_nodelinklist(head);//元素个数
	//3、排序轮数
	int lun = num - 1;
	//printf("%d\n",num);
	//4、排序交换
	node_t* before = head->next; 
	node_t* after = before->next;
	for(int i = 0 ; i < lun ;i++)//外层循环轮数
	{   
		//重置
		before = head->next;
		after = before->next;
		for (int j = 0; j < lun -i; j++)//内层循环交换次数
		{
			if(after->data <before->data)//交换
			{
				int temp = after->data;
				after->data = before->data;
			 	before->data = temp;
			}
			//向右移动
			before = after;
			after = before->next;
		}
	}
}

函数指针的应用

1.函数指针

函数指针是一个指针变量,它指向一个函数。函数指针可以被用来调用指向的函数,也可以被用来作为参数传递给其他函数。函数指针的定义和使用如下:

定义:

return_type(函数的返回值类型) (*pointer_name)(指针名)(parameter_list);(函数的参数列表)
相当于定义一个指针,指针指向一个规定好的函数返回值类型以及参数列表的函数地址。

示例:
#include <stdio.h>

void greeting() {
     printf("Hello, World!\n");
 }

int main() {
     void (*func_ptr)() = greeting; // 定义一个函数指针并将其初始化为greeting函数的地址
     func_ptr(); // 调用通过函数指针指向的函数
     return 0;
 }

在这个例子中,func_ptr 是一个指向 greeting 函数的函数指针。

2. 指针函数

“指针函数”是一个通常造成混淆的术语,实际上是指返回指针的函数。指针函数的定义和使用如下:

定义:

return_type* (返回指针类型)function_name(函数名)(parameter_list);(参数列表)

示例:
#include <stdio.h>

int* get_value() {
     static int value = 42;
     return &value;
 }

int main() {
     int *val_ptr = get_value(); // 调用返回指针的函数
     printf("Value: %d\n", *val_ptr); // 解引用指针来获取值
     return 0;
 }

在这个例子中,get_value 是一个返回整数指针的函数,也就是所谓的“指针函数”。

区别与联系:

  1. 函数指针是一个变量,它存储了一个函数的地址,可以被用来间接调用这个函数。
  2. 指针函数是一个函数,它返回一个指针。
  3. 两者的主要区别在于,一个是变量(指向函数的指针),而另一个是函数(返回指针)。

单向循环链表中函数指针的应用(结合typedef)

//3、打印(针对性打印 只打印名字等)
typedef void (showfun_t) (stu_t *stup);
/*
定义一个函数指针  类型为 void (函数名)(stu_t *stup)
也可以定义为 typedef void (*showfun_t) (stu_t *stup), 此时下面不需要*;
showfun_t * fun  此时 fun 为函数 void fun (stu_t *stup)
*/

//打印姓名
void show_name(stu_t *stup)
{
    printf("%s\n",stup->name);
}
//打印年龄
void show_age(stu_t *stup)
{
    printf("%d\n",stup->age);
}
//打印所有
void show_all(stu_t *stup)
{
    printf("%s %d\n",stup->name,stup->age);
}

//链表打印函数
int show_dlinklist(node_t * head ,showfun_t *showfun)//函数指针作为参数 
{
    //1、参数判断
    if(NULL == head || NULL == head->next || NULL == showfun)
        {
            perror("parameters is error\n");
        }
    //2、遍历打印
    node_t *temp = head->next;
    while(temp != head)//循环链表注意与单项链表的区别
    {
        showfun(temp->stus);
        temp = temp->next;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值