2022/10/21

发布于:2022-10-22 ⋅ 阅读:(531) ⋅ 点赞:(0)

目录

qsort函数

malloc动态开辟内存



qsort函数

qsort函数 是C语言自带的排序函数,头文件需要两个 

stdio.h 和 search.h

qsort一共四个变量  

第一个变量:排序的元素的首地址,一般用数组名

第二个变量:排序的次数   如果全排就是数组长度

第三个变量  排序元素的字节大小 sizeof(类型名)

第四个变量需要自己写一个函数 返回值是int 有两个形参 他们都是const保护的空指针

const void * a 和  const void * b

写一个例子

int cmp(const void * a ,const void * b)

{

return *(int*)a-*(int*)b;
}

这里的return 解释一下 由于返回值为int  但是传入的形参为void* 型的 

,需要强制转化为int* ,再解引用得到的就是int了

现在我们会了这个函数了操作一番试试吧

发现确实 排序了 。默认是升序的

如果想要降序怎么办?

很简单,qsort 函数的形参最后一个指针函数 的返回值加一个符号就行了


C++排序还有一个函数叫做sort 比qsort要容易

sort(数组名,数组名+数组长度)

感兴趣的小伙伴可以搜搜


malloc动态开辟内存

malloc 是一个函数  其形参是要开辟的内存的大小,返回值是 void* 常常需要强制转化

例如动态开辟一个单链表的节点:

int *p=(struct Node*)malloc(sizeof(struct Node));

//指针变量p指向动态开辟的内存(类型是struct Node)


KiKi学结构体和指针_牛客题霸_牛客网 (nowcoder.com)

这道题是单链表的创建和删除一个数

重定义 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//单链表的创建
struct Node
{
	int date;
	struct Node* next;//next 指向的也是一个结构体
};
int main()
{
	int m;
	int n;
	scanf("%d",&n);
	struct Node* list = NULL;
	struct Node* tail = NULL;
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&m);
		struct Node* pn = (struct Node*)malloc(sizeof(struct Node));
		pn->date = m;
		pn->next = NULL;
		//每次输入创建一个节点
		//第一个节点链接的时候
		if (list == NULL)
		{
			list = pn;
			tail = pn;//注意尾指针一定要指向尾部 无论是第一次还是以后

		}
		else
		{
			tail->next = pn;
			tail = pn;
		}

	}
	//接下来执行删除操作
	int d;
	struct Node* cur = list;
	struct Node* del = NULL;
	struct Node* prev = NULL;
	scanf("%d", &d);//要删除的元素d
	while (cur)
	{
	if (cur->date == d)//执行删除操作
	{
		struct Node* pd = cur;
		//如果删除的是第一个元素
		if (list == cur)
		{
			//prev = cur;
			list = list->next;
			cur = list;
		}
		else//如果删除的是第一个以后的元素
		{
			prev->next = cur->next;
			cur = cur->next;
		}
		n--;
		free(pd);
	}

	else//执行下一个判断cur
	{
		prev = cur;
		cur = cur->next;
	}
}
	printf("%d\n",n);
		cur =list;//删除完了以后cur指向了NULL 此时输出要把它指向头指针
		while (cur)
		{
			printf("%d ", cur->date);
			cur = cur->next;
		}
		cur = list;
		struct Node* dele = NULL;
		while (cur)
		{
			del = cur;
			cur = cur->next;
			free(dele);
		}
		return 0;
}

free的节点一般用另一个指针表示 不用cur;

还有一篇总结,单独写出来一个数据结构的栏目

本文含有隐藏内容,请 开通VIP 后查看