数据结构学习笔记2

来源:互联网 发布:软件变成仿手绘 编辑:程序博客网 时间:2024/04/19 08:54

1.线性结构2 一元多项式的乘法与加法运算

  要想将第二个多项式的每一个项都乘以第一个多项式的每一项,我们就不能运用多项式相加时候输入一项就计算一项,我们必须先将第一个多项式存储在一个数组中,每输入第二个多项式的一项就乘以第一个多项式数组,乘的方式按照指数相加,系数相乘的方式,这里我们为什么要将第一个多项式用结构体数组而不用普通数组那样下标存指数,数组元素存系数的方式呢?是因为我们在用第二个多项式的每一项乘以第一个多项式时如果不用结构体数组就必须找出普通数组中的非零项再相乘,如果用结构体数组则可以直接访问到第一个多项式的每一项从而与第二个多项式的每一项相乘。

#include <stdio.h>

struct node

{

    int c;

    int x;

}arr[1001];

int main()

{

    int n,m,a[2010]={0},b[1010]={0};

    scanf("%d",&n);

    int temp1,temp2;

    for(int i=0;i<n;i++)

    {

        scanf("%d%d",&arr[i].c,&arr[i].x);

        b[arr[i].x] +=arr[i].c;

    }

    scanf("%d",&m);

    for(int i=0;i<m;i++)

    {

        scanf("%d%d",&temp1,&temp2);

        b[temp2]+=temp1;

        for(int j=0;j<n;j++)

            a[arr[j].x+temp2]+=arr[j].c*temp1;

    }

    int isfirst=1,haveoutput=0;

    for(int i=2000;i>=0;i--)

    {

        if(a[i]!=0){

        if(isfirst==0)printf(" %d %d",a[i],i);

        else{

            isfirst = 0;

            printf("%d %d",a[i],i);

        }

            haveoutput = 1;

            }

    }

    if(haveoutput==0)printf("0 0");

    printf("\n");

    isfirst=1;

    haveoutput=0;

    for(int i=1000;i>=0;i--)

    {

        if(b[i]!=0){

            if(isfirst==0)printf(" %d %d",b[i],i);

            else{

                isfirst = 0;

                printf("%d %d",b[i],i);

            }

            haveoutput = 1;

        }

    }

    if(haveoutput==0)printf("0 0\n");

    return 0;

}

2.图的邻接矩阵表示法
   int G[MAXN][MAXN],Nv,Ne;
   void BuildGraph()
  { 
     int  i,j,v1,v2,w;
     scanf("%d",&Nv);
     for(i=0;i<Nv;i++)
         for(j=0;j<Nv;j++)
         G[i][j]=0;
     scanf("%d",&Ne);
     for(i=0;i<Ne;i++)
     {
     scanf("%d %d %d",&v1,&v2,&w);
     G[v1][v2]=w;
     G[v2][v1]=w;
       }
  }
3.图1 列出连通集
   深度优先遍历:图的深度优先遍历类似于树的先根遍历。访问顶点V0,然后选择一个V0邻接到的且未被访问过的顶点V1,再从V1出发进行深度优先遍历;当遇到一个所有邻接于它的顶点都已被访问过了的顶点Vt时,则返回到已访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点Vs,再从Vs出发继续深度优先遍历;当V0可达的顶点都已被访问过时,以V0为出发点的遍历完成。若这时还有未被访问的顶点时,则从中再选一个未被访问的顶点作为出发点,重复上述过程,知道图G中的所有顶点都已被访问过为止。图的所有顶点加上遍历时所经过的边构成的子图称作图的生成树。对于不连通的无向图,从任意顶点出发一般不能系统地访问遍所有的顶点,而只能得到以此顶点为根的连通分支的生成树。
   广度优先遍历:图的广度优先遍历类似于树的层次遍历。其方法是:访问顶点V0.然后依次访问V0邻接到的所有未被访问过的顶点V1,V2。。。。Vt,再依次访问V1,V2,。。。Vt邻接到的所有违背访问过的节点,如此进行下去,当V0可达的顶点都已访问过时,以V0为出发点的遍历完成。若这时图中还有未被访问过的顶点,则从中再选一个未被访问的顶点作为出发点,重复上述过程,直至图G中的所有顶点都已被访问过为止。

#include <stdio.h>

#include <stdlib.h>

#define MAXN 15

int G[MAXN][MAXN];

int Nv,Ne;

int visited[MAXN]={0};

void BulidG()

{

    scanf("%d %d",&Nv,&Ne);

    int i,j,v1,v2;

    for(i=0;i<Nv;i++)

        for(j=0;j<Nv;j++)   //图的邻接矩阵表示法

            G[i][j]=0;

    for(i=0;i<Ne;i++)

    {

        scanf("%d %d",&v1,&v2);

        G[v1][v2]=1;

        G[v2][v1]=1;

    }

}

void DFS(int v)//深搜

{

    visited[v]=1;

    printf("%d ",v);

    for(int i=0;i<Nv;i++)

    {

    if(G[v][i]!=0&&visited[i]==0)

        DFS(i);

    }

    

}

void LDFS()

{

    int i;

    for(i=0;i<Nv;i++)

    {

    if(visited[i]==0)

    {

        printf("{ ");

        DFS(i);

        printf("}\n");

    }

    }

}

void vi(){

    int i;

    for(i=0;i<Nv;i++)

      visited[i]=0;

}

//宽搜

void BFS(int v){

    const int MAXSIZE=100;

    int quene[MAXSIZE];

    int first=-1,rear=-1;

    quene[++rear]=v;

    visited[v]=1;

    while(first<rear)

    {

        int de = quene[++first];

        printf("%d ",de);

        for(int i=0;i<Nv;i++)

        {

        if(visited[i]==0&&G[de][i]!=0)

        {

            visited[i]=1;

            quene[++rear]=i;

        }

        }

    }

}

void LBFS()

{

    int i;

    for(i=0;i<Nv;i++)

    {

    if(visited[i]==0)

    {

        printf("{ ");

        BFS(i);

        printf("}\n");

    }

    }

}

int main()

{

    BulidG();

    LDFS();

    vi();

    LBFS();

    return 0;

}



0 0
原创粉丝点击