目录

启用断言测试宏

//#undef  _EXAM_ASSERT_TEST_    //禁用
#define  _EXAM_ASSERT_TEST_   //启用
#ifdef _EXAM_ASSERT_TEST_     //启用断言测试
void assert_report(const char * file_name, const char * function_name, unsigned int line_no)
{
	printf("\n[EXAM]Error Report file_name: %s, function_name: %s, line %u\n",
		file_name, function_name, line_no);
	abort();
}

#define  ASSERT_REPORT( condition )       \
 do{       \
 if ( condition )       \
  NULL;        \
 else         \
  assert_report( __FILE__, __func__, __LINE__ ); \
 }while(0)

#else // 禁用断言测试
#define ASSERT_REPORT( condition )  NULL
#endif /* end of ASSERT */

插入法排序

#include<stdio.h>
#include<stdlib.h>
#define N 100
void main()
{
	int arr[N], nj, ni, i, h;
	for (i = 0; i < N; i++)
	{
		arr[i] = rand();
	}
	for (i = 1; i < N; i++)

	{
		h = arr[i];.
		for (ni = i - 1; ni >= 0; ni--)
		{
			if (h < arr[ni])
			{
				arr[ni + 1] = arr[ni];
				arr[ni] = h;
			}
		}
	}
	for (i = 0; i < N; i++)
	{
		printf("%d\t", arr[i]);
	}
	system("pause");
}

函数并不能改变实参的值

  • 下面的例子将证明,即使用swap函数对a,b做了交换,也是没有效果的。
#include<stdio.h>
void swap(int a, int b);
void main()
{
	int a, b;
	a = 1;
	b = 2;
	swap(a, b);
	printf("%d,%d\t", a, b);
	system("pause");
}
void swap(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
  • 但是用指针来作为传递就会有效。我们对上面的例子稍作更改,如下:
#include<stdio.h>
void swap(int a, int b);
void main()
{
	int a, b;
	a = 1;
	b = 2;
	swap(&a, &b);
	printf("%d,%d\t", a, b);
	system("pause");
}
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

数组的函数传递均为引用传递,即将数组的首地址传给函数的形参。所以形参的数组如何定义都可。如:void nzp(int a[])或者void nzp(int a[10])。都是没问题的。

并归排序

  • 这里只给出函数,如需测试请在主函数中调用mergesort()函数。
#include <stdlib.h> /*含ma l l o c ( ) 的头文件*/
#include <stdio.h>

void merge(int *arr, int p, int q, int r) {//定义arr指向数组首地址(这里定义为arr[]或arr[“随意数字”]也可以),p为数组首位,q为中间位,r为末位
	int n1, n2, i, j, k, *arrl, *arrr;
	n1 = q - p + 1;//定义n1为p到q的元素个数
	n2 = r - q;//定义n2为q+1到r的元素个数
	arrl = (int*)calloc(n1, sizeof(int));//为arrl动态分配n1个int内存
	arrr = (int*)calloc(n2, sizeof(int));//未arrr动态分配内存
	if (arrl == NULL || arrr == NULL)//判断内存是否分配成功,如果不成功则关闭程序
	{
		abort();
	}
	for (i = 0; i < n1; i++)//将arr数组的前p到q个赋给arrl
	{
		arrl[i] = arr[p + i];
	}
	for (i = 0; i < n2; i++)//将arr数组的q+1到r个赋给arrr
	{
		arrr[i] = arr[q + 1 + i];
	}
	i = j = 0;//i,j重新归零,指向数组的首个位置
	for (k = p; k <= r; k++)//数组合并并排序
	{
		if ((arrl[i]<arrr[j] && i<n1) || j >= n2)//i<n1是防止arrl越界,j >= n2是防止arrr越界。越界的值很有可能为0,造成条件一直成立。
		{
			arr[k] = arrl[i++];//将小的值放到arr数组中并且i加1
		}
		else
		{
			arr[k] = arrr[j++];
		}
	}
	free(arrl);//释放arrl动态内存
	free(arrr);//释放arrr动态内存
	arrl = arrr = NULL;//将指针归零,此步骤不可省去,否则会产生野指针
}
void mergesort(int *arr, int p, int r) {
	if (p < r)
	{
		int q;
		q = (r + p) / 2;
		mergesort(arr, p, q);
		mergesort(arr, q + 1, r);
		merge(arr, p, q, r);
	}
}