笔记:图以及cpp基础

1.头文件:

c一般用#include“stdio.h"

而cpp用的为#include "iostream" (简记ios+tream)

此外还有加一行using namespace std;

2.标准输入输出:

c实现:

scanf("%d",&a);

printf("%d/n",a);

cpp实现:

cin>>a cout<<a<<endl

简记为:输入>>,输出<<

cpp不用标明数据的类型,而c需要。在没有指定域时一般采取就近原则输出。

例如:

namespace A
{
    int a=10;
    namespace B
    {
        int a=20;                
    }
}

cout<<A::a<<endl;  //毋庸置疑输出的就是A中的int a=10;
cout<<A::B::a<<endl;//此处输出的为B中的int a=20;

3.同时存在相同名字的函数(函数重载)

在c语言中同名函数不能同时存在。而c++可以

定义:同一个作用域内,相同函数名,参数不同(类型不同,个数不同)可以构成函数重载(和返回值无关)

函数重载的定义:函数重载的原理是会进行函数名修饰。如int fun(int i,char a)和void fun(char a,int i)就可以构成函数重载,根据函数名修饰的原理我们可以得到_funic和 _funci两个经过修饰之后得到的函数名,在进行修饰后的函数名显然是不同的。

自我理解为:用参数类型添加了一个修饰,int就加i,char就加c。

4.缺省参数

cpp可以在定义时为参数进行一个赋值,只要它被初始化赋值那么在调用时可以不用传参哩。

#include "iostream"

using namespace std;

int Add (int a,int b = 20)
//有多个参数时int Add (int a,int b,int c = 30)
{
   return a+b;
}

int main()
{
   cout<<Add(10)<<endl;
   cout<<Add(10,30)<<endl;
}

5.指针(*)和引用(&)

指针:指针仍然是指向一个数据的地址。

引用:理解为新增一个该数据的别名,实际作用和该数据本身其实没区别。

简单举例为swap()函数

void swap(int &a,int &b)
{
    int temp=a;
    a=b;
    b=temp;
}

void swap(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

引用和指针的区别和联系

1.引用只能在初始化是引用一次,不能改变为再引用其他变量;而指针变量的值可变

2.引用必须指向有效的变量,而指针可以为空

3.相对而言,引用比指针更安全,指针比引用更灵活

图:

图的逻辑结构:多对多

图没有顺序存储结构,但可以用二维数组来表示元素之间的关系(邻接矩阵)

链式存储结构:因为图很难确定有几个指针,所以难以用链表表示,故采用多重链表(邻接表,邻接多重表,十字链表)

1.数组表示法(邻接矩阵法)

(1)建立一个顶点表(记录各个顶点的信息)

(2)建立邻接矩阵(表示各个顶点之间的关系)

例:设图A=(V,E)有n个顶点,则

顶点表Vexs【n】就建立n个元素的数组存放n个顶点。

图的邻接矩阵为一个二维数组,设为A.arcs【i】【j】(理解为两个顶点之间的关系)

如果存在一条弧或者一条边,则矩阵中记录【i】【j】为1

如若不存在的话则记录为0;

分析其一:无向图的邻接矩阵是对称的

分析其二:顶点i的度即为第i行和i列的“1”的个数,如果是无向图就只要考虑每一行“1”的个数。

完全矩阵:只有对角元素为0,其他元素全部为1。

无向邻接矩阵:

表示为:

有向邻接矩阵:

表示为:

有向的邻接矩阵:

第i行的含义:以节点vi为尾的弧(即出渡边)

第i列的含义:以节点vi为头的弧(即入度边)

有向的邻接矩阵不一定是对称的

简单的邻接矩阵实现(有向):

#include "iostream"
using namespace std;

int main()
{
    int v,e;
    
   cout<<"请输入节点个数:";
   cin>>v;
   
   cout<<"请输入边的个数:";
   cin>>e;
   
   int data_bian[v][2],Arcs[v][v]={0},Vexs[v]={0};
   
   for(int i=0;i<e;i++)
       cin>>data_bian[i][0]>>data_bian[i][1];   //输入节点的边
       
       
       for(int i=0;i<e;i++)
    Arcs[data_bian[i][0]][data_bian[i][1]]=1; //有弧就置1
       
    for(int i=0;i<v;i++)
        for(int j=0;j<v;j++)
            Vexs[i]+=Arcs[i][j]+Arcs[j][i];  //计算每一个节点的度
        
    
       
       return 0;
}

网(有权图)的邻接矩阵表示法:

即对边值进行另一种判定,有边就记录权值,没有边就记录为无穷大。

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值