C语言最近学习的知识:
递归,快速排序,选择排序,插入排序,结构体,枚举类型。
递归
递归有3个准则:1.求解规则一样2.问题求解规模缩小3.有一边界条件。
对于最简单的递归是:
int f(int x)
{int y,z;
z=f(y);
return 2*z;
}
调用f函数本身的时候又用到本函数。
有个注意事项是我们必须注意会不会存在堆栈溢出的情况。
还有最著名的汉诺塔问题
#include <stdio.h>
void hanoi(int n , char A , char B , char C)
{
if(n == 1)
printf("%c --> %c\n",A,C);
else
{
hanoi(n-1,A,C,B);
printf("%c --> %c\n",A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int t;
scanf("%d",&t);
hanoi(t,'A','B','C');
return 0;
}
初学者大多都是利用这个问题来加深自己的对于递归的理解。
快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
而我现在就是利用的递归的方法来做,来加深对于递归的用法。
#include <stdio.h>
#include <stdlib.h>
void d(int a[], int n)
{
for(int i = 0; i < n; i++)
printf(" %d ", a[i]);
printf("\n");
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void quicksort(int a[], int n, int low, int high)
{
int i, j;
if(low < high)
{
i = low + 1;
j = high;
while(i < j)
{
if(a[i] > a[low])
{
swap(&a[i], &a[j]);
j--;
}
else
{
i++;
}
}
if(a[i] >= a[low])
i--;
swap(&a[low], &a[i]);
quicksort(a, n, low, i);
quicksort(a, n, j, high);
}
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
printf("排序前的数组\n");
d(a, n);
quicksort(a, n, 0, n-1);
printf("排序后的数组\n");
d(a, n);
return 0;
}
选择排序
对于选择排序,它属于八大排序之一,是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
具体代码就不上了,用简单的描述就是一个有序数列的最后一个和无序数列的第一个来比较,而且他们是相邻的。
插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。实际是也就是利用的迭代的思想。
#include<stdio.h>
int main()
{
void sort(int s[],int n);
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,n);
for(i=0;i<n;i++)
printf("%3d",a[i]);
return 0;
}
void sort(int s[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
j=i;
t=s[j];
while(t<s[j-1]&&j>0){
s[j]=s[j-1];
s[j-1]=t;
j--;
}
}
}
结构体
结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。
结构体类型不是由系统定义好的,而是需要程序设计者自己定义的。C语言提供了关键字struct来标识所定义的结构体类型。
关键字struct和结构体名组合成一种类型标识符,其地位如同通常的int、char等类型标识符,其用途就像 int 类型标识符标识整型变量一样可以用来定义结构体变量。定义变量以后,该变量就可以像定义的其他变量一样使用了;成员又称为成员变量,它是结构体所包含的若干个基本的结构类型,必须用“{}”括起来,并且要以分号结束,每个成员应表明具体的数据类型。
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
声明类型时结构体的定义一般形式为
struct 结构体名
{成员表列
}变量名表列;
不指定类型名而直接定义时:
struct
{成员表列
}变量名表列;
它的优点是不是数组只能储存单一变量
枚举
对于枚举,它是常量而不是变量,一旦输入进去了就不能变了,枚举常量是由程序设计者命名的,用什么名字代表什么含义,完全由程序员根据自己的需要而定,并且在程序中做相应处理。
声明枚举类型的一般形式为:
enum[枚举名]{枚举元素列表}
对于枚举元素们要用,隔开。
它解决了用过多的#define的难题。