冒泡排序算法
核心思想:
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 是一个返回整数指针的函数,也就是所谓的“指针函数”。
区别与联系:
- 函数指针是一个变量,它存储了一个函数的地址,可以被用来间接调用这个函数。
- 指针函数是一个函数,它返回一个指针。
- 两者的主要区别在于,一个是变量(指向函数的指针),而另一个是函数(返回指针)。
单向循环链表中函数指针的应用(结合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;
}