数据结构 第二章 数组和结构

数组实现的本周

arry[0] 为基地址  

arry[i]被编译器解释为指向  arry  + i *sizeof ( data type ) 的指针  

————————————————————————————————————————————————————数组作为函数参数

①数组元素就是下标变量,它与普通变量并无区别。

形参和实参占用不同储存位字,所以实参不会受形参影响,return才能得到形参

void nzp(int v){
    if(v>0)
        printf("%d ",v);
    else
        printf("%d ",0);
}
int main(void){
    int a[5],i;
    printf("input 5 numbers\n");
    for(i=0;i<5;i++){
        scanf("%d",&a[i]);
        nzp(a[i]);
    }
    return 0;
}

②数组名作为函数参数

形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

所以形参可以看做实参,形参的运算对实参产生影响

void nzp(int a[5]){
    int i;
    printf("\nvalues of array a are:\n");
    for(i=0;i<5;i++){
        a[i]=0;
        printf("%d ",a[i]);
    }
}

int main(void){
    int b[5],i;
    printf("\ninput 5 numbers:\n");
    for(i=0;i<5;i++)
        scanf("%d",&b[i]);
    printf("initial values of array b are:\n");
    for(i=0;i<5;i++)
        printf("%d ",b[i]);
    nzp(b);
    printf("\nlast values of array b are:\n");
    for(i=0;i<5;i++)
        printf("%d ",b[i]);
    return 0;
}

数组已经改变

————————————————————————————————————————————————————

动态构造二维数组


二维数组的实际表示是  一个一维数组 ,其中每个单元本身又是一个一维数组 

创立步骤

1. type data **arry 

2.   先给一个一维数组分配空间  

3. 再这个一维数组的每一个单元分配一维数组

#include<stdio.h>
#include<stdlib.h> 

// 创建一个 arry[5][5] 
int **create (int**x)
{   int q=0;   
  x=(int**) malloc( sizeof(int) *5 );
	
	for(q=0;q<5;q++ )
      x[q]=	(int *)malloc( sizeof(int) *5 );
   
   x[2][1]=3;
   return x;
}


int main(void)
{    
   int **x;
	x= create(x);
	 printf("%d", x[2][1]);
	 
	
}

————————————————————————————————————————————————————

do while 用法 ,至少执行一次,如果满足条件继续执行


do {

}  

 while ( 条件 ) ;  //注意这个;

————————————————————————————————————————————————————

检查结构体是否相等的方法: 构造每一项对比的函数 


结构日中亦可以放入结构体


————————————————————————————————————————————————————

枚举类型

 enum week{ mon,tue,thrus

}day;    //写法类似struct

enum week{ mon,tue,thrus

}day;    枚举默认mon为0,tue为1.......


  enum week{mon,tue=2,thrus

}day=tue;    // 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

多项式 

譬如:A(x) = 3x20 + 2x5 + 6x3 + x + 4 ,

          B(x) = 7x5 + x4 + 10x3 + 3x2 + 1

多项式结构:

struct polynomial

{ float ceof ;  //系数

int expon; //指数

}

首先分配了固定的空间 struct polynomial terms[MAXSIZE];

几个多项式按照顺序一个接着一个共用这个空间

startA,finishA为 A项的初位和末位

 // 系数X指数



//注意某些编译器须要在开头处申明变量,不能在其他地方

i=0;

while(输入A的时候)

{  输入 term[i++]的coef和exp;}

 finishA=i-1;

startB=i;

j=startB;

while(输入B的时候)

{  输入 term[j++]的coef和exp;}

finishB=j-1;

avail= j ;

//avail 可以做下一个多项式的起始位置;

多项式加法:(注意这里的多项式应该是标准的,指数大的靠前)

D=A+B

while(startA<= finishA&& startB<= finishB)

{     if(  term[startA]的指数 >term[startB]的指数) 使D的多项式下一个为 term[startA] 。startA++

     if(  term[A]的指数 =term[A]的指数)   使D的多项式下一个为term[startA]和term[startB]系数相加,指数不变, 

                                                                 且startB++ startA++


    if(  term[A]的指数 >term[A]的指数)     使D的多项式下一个为 term[startB] 。startB++

   
     //可能出现一个多项式全部加入到D项中,而另一个多项式因为前一个多项式已经扫描结束而一起结束,所以加上下面的函数
       for(;startA<=finishA;startA++)
   attach(terms[startA].ceof   , terms[startA].expon,terms,avail );
    
   for(;startB<=finishB;startB++)

   attach(terms[startB].ceof   , terms[startB].expon,terms,avail );

————————————————————————————————————————————————————

D的多项式是从avail开始

void attach(float coef,int exon,polynomial *terms,int *avail )
{       if( *avail > MAX_TERMS )
     { printf("error");  exit(EXIT_FAILURE); }
     terms[ *avail].ceof = coef;
     terms[ (*avail)++].expon=exon;
 

}

————————————————————————————————————————————————————

三元组转序的一个关键点:


//把每一行的元素数归0后


//  原三元组一个一个开始扫,没扫道一个 对应的行 的元素数++

————————————————————————————————————————————————————

矩阵:第一个的列数和第二个的行数相同

A{\displaystyle m\times n}m\times n矩阵,B{\displaystyle n\times p}n\times p矩阵 //注意这俩个n    结果是m x p


A第的每一行第一个数乘以B的第一行,第二个数乘以B的第二行、、、、


稀疏矩阵的数据表示方法:三元组

#define MAX_TERMS 101 /* maximum number of terms +1*/
typedef struct{
int row;
int col;
int value;
} term;

term a[MAX_TERMS]; 

a[0] 用来记录矩阵的行数,列数,以及包含非0的元素的个数

矩阵相加: 首先满足两个矩阵行列均相等

矩阵a和矩阵b相加=矩阵c —思路:

//首先检验矩阵行列数是否相等

C[0] 的行列首先赋值 

int i=1,j=1 ,ck=1  //i ,j 分别用来给a[],b[],c[]计数

while (i<=a[0].value && j<=b[0].value ) // 扫描a的元素,扫描b的元素,  因为是按a[],b[[]都是按照行顺序排列的,其中一个扫描结束,另外一个也将结束(此时不会出现行列相同的情况了)

 {    if(a[i].row行= b[ i] .row) 

     {      if (a[i].col < b[j].cow)         

                      

           a[i]的所有元素值 赋给 c[ck]    i,ck都++ //这个a[i],c[ck]值分配结束

            else if (a[i].col > b[j].col)        

                      b[j]的所有元素值  赋给 c[ck]    j,ck都++


             }       

            else  //行列数均相等情况

           {    此时a ,b 行列数相等,所以任意赋a或b的行列数给c

 

              且c的value = a[i].value +b[ j ].value  且 i , j ,ck都加加               }

         }

         else if(a[i].row行< b[ i] .row) 

          {      a[i]的所有元素付给c[ck] .............      }              

       

         else 

          {       b[j]的所有元素付给c[ck] .............      }         

 }

//循环结束,可能会出现一个扫描完了,另一个还未扫描的情况。所以如下操作,但是如下操作只有可能执行其中一个循环

for (   ;i<=a[0].value ;i++ )

     a[i]付给c .......

for (   ;j<=b[0].value ;j++ )

b[i]付给c .......

————————————————————————————————————————————————————



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值