目录
一,图
1,图的基本概念
图:数据元素之间的关系是任意的我们就称之为图
顶点:途中的每一个数据元素我们都称之为顶点
边:数据元素之间的关系称之为边
有向图:若顶点与顶点之间的边具有方向,我们称之为有向图。(注:方向是单向的)
无向图:若顶点与顶点之间的关系是无向边的,我们称之为无向图。(注:方向是是双向的)
简单图:不存在重复的边
完全图:任意两个顶点之间都可以通过边找到,也称之为连通图。
连通⼦图:在图中部分顶点是连通的就叫做连通⼦图。
极⼤连通⼦图:在图中顶点是连通,但任意加⼊⼀个顶点后不连通,则图 中连通的顶点为极⼤连通⼦图。
路径:顶点1到顶点2之间的经过的顶点序列就叫做⼀条路径
路径⻓度:路径上边的数⽬
边的权:在⼀个图中,每条边都可以表上具有某种含义的数值,就叫做边的权值
⽹:如果图中边带上权值,则图就叫带权图也叫做⽹。
2,图的存储
邻接矩阵:用一个二维数组存储图中边的信息(各顶点之间的邻接关系)。
邻接表:对图的每个顶点建立一个单链表,存储该顶点所有邻接顶点及其相关信息。
二,查找排序
1,排序
按照一定的方式,对数据元素进行依次排序
1.1,冒泡排序
从小到大的顺序排序:从左向右将相邻的两个数据元素进行比较,如果前一个数据元素大于后一个数据元素就把两个数据元素进行交换,如果前一个数据元素小于后一个数据元素就不交换,但要保证后面的数据元素都比前面的数据元素大。
举例说明:1,2,5 ,6,4,9,7
//将数据元素按从小到大的顺序进行排序
#include<stdio.h>
int main()
{
int a[]={1,2,5,6,4,9,7};
for(int k=0;k<6;k++) //因为是两个元素之间比较所以只遍历到数组中的前一个数据元素就能完成
{
for(int i=0;i<6-k;i++) //一个元素一个元素的比较
{
if(a[i]>a[i+1]) //如果大于就交换
{
int t = a[i+1];
a[i+1] = a[i];
a[i] = t;
}
}
}
for(int i=0;i<7;i++) //遍历所有元素然后打印
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
1.2,选择排序
遍历所有数据元素,找到最小的数据元素然后和第一个数据元素进行交换,其余数据元素依次进行,,直到n-1个位置数据确定。即:在比较时,都是使用最小的数据元素和其余的数据元素进行比较,当遇到新的最小的数据元素时就最小的数据元素就发生变化,然后用新的最小的数据元素进行比较
举例说明:1,2,5 ,6,4,9,7
//选择排序
//按从小到大的顺序排列一组数
#include<stdio.h>
int main()
{
int a[]={1,2,5,6,4,9,7};
for(int i=0;i<6;i++)
{
int min=i;
for(int j=i+1;j<7;j++) //首先找到最小的那个数
{
if(a[min]>a[j])
{
min=j;
}
}
int t=a[i]; //在进行交换
a[i]=a[min];
a[min]=t;
}
for(int i=0;i<7;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
2,查找
折半查找:在一个有序的数据元素中,将首先找到中间元素,(因为数据元素时有序的,所以当中间元素不符合要求时只能在中间元素的前半部分或者后半部分)判断是否等于需要查找的元素,如果是就返回数据,如果不是,那么数据元素就只会落在中间元素的前半部分或后半部分,在进行折半查找,直到找到等于要查找的元素为止。
//查找元素 折半查找
#include<stdio.h>
int main()
{
int a[]={1,3,5,7,9,12,15,16,18,19,20,22,25};
int x;
scanf("%d",&x);
int l=0,h=sizeof(a)/sizeof(int)-1;
int m;
while(l>h)
{
m = (l/h)/2;
if(a[m] == x)
{
printf("find data pos is %d ,data is %d\n ",m,a[m]);
}
else if(a[m]>x)
{
h=m-1;
}
else if(a[m]<x)
{
l=m+1;
}
else
{
printf("data not on the here\n");
}
}
return 0;
}
三,类型替换
概念:将数据类型更改为新名字,使用新名字也就代表着使用该数据类型
定义:typedef 数据类型 新名字;