线性表学习指导

 

程序设计只能靠自己上机实践、一题题的消化,没有其它方法可以取代。行动吧!做一个能学习计算机的人。

本文所指的书《C程序设计》,谭浩强,第四版、《数据结构》耿国华。

OJ网址http://218.5.241.13:8060/oj,内有分基础题basic区http://218.5.241.13:8060/oj/base/index.jsp

和普通区http://218.5.241.13:8060/oj/index.jsp,s开头是basic区,smu开头的是普通区。

一、    线性表主要的基础数据结构是:数组、函数、指针、自定义结构

一维数组:

★例S1214、求n个学生的平均年龄。

.int a[100];// 用a[0]、a[1]、……、a[99]表示100个学生的年龄,

.int sum, average;//年龄总和,平均年龄

//求和

.sum = 0;

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

      .sum = sum+a[i];

★完成S1062、S1137。

二维数组:

.int  A[2][3];//表示下表中的6个变量.

A[0][0]

A[0][1]

A[0][2]

A[1][0]

A[1][1]

A[1][2]

 

★例、s1065矩阵和

.int a[10][20],b[10][20];//分别表示要加的两个矩阵.

//对两个p*q的矩阵,输出它们的和

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

           {

              for(j=0;j<q;j++)

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

              printf("\n");

           }


 


★选练:S1042、S1066、S1074

函数:P176

函数的操作:声明、定义、引用

★S1110 求方差。

 

 #include<stdio.h>

double Avage(double a[100],int n)//求数组中n个数的平均数

{

    double avage = 0;

    int i;

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

        avage += a[i];

    avage /=n;

    return avage;

} 

double ss(double tt,double b[100],int n)//求方差,tt是平均数

{

   int i;

   double sum=0;

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

     sum+=(tt-b[i])*(tt-b[i]);

   sum/=n;

   return sum;

}

void main()

{

   int t,n,i,j;

   double data[100],ttt,s;

   while(scanf("%d",&t)!=EOF)

   {

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

     {

        scanf("%d",&n);

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

        {

          scanf("%lf",&data[j]);

        }

        ttt=Avage(data,n);//调用函数求平均数,

        s=ss(ttt,data,n);//调用函数求方差

        printf("s^2=%.2lf\n",s);

     }

   }

}





★    每个问题都可以独立成函数,再加以调用。大家可以任选几道(至少3道)加以训练。

 

指针:(这部分的内容较为抽象,要多练、多思考、动真的用指针写代码)

指针是变量的地址

★    例、比较a、b两数的大小,看P225。复制下列代码到VC,并观察。

#include <stdio.h>

int main(){

      int *p1,*p2,*p,a,b;

      scanf("%d%d",&a,&b);

      p1 = &a;

      p2 = &b;

      if(a<b){

           p = p1; p1 = p2; p2 = p;

      }

      printf("max=%d, min=%d\n",*p1,*p2);

      return 0;

}


 

★    用指针完成S1004、S1010

 

指针作为函数的参数,P226

给你下列函数,重新完成S1004、S1010

void swap(int *p1, int *p2){

   int temp;

   temp = *p1;

   *p1 = *p2;

   *p2 = temp;

}


错:

void swap(int *p1, int *p2){

      int *p;

      p = p1;

      p1 = p2;

      p2 = p;

}
//这不可用,因为函数是单向传递,交换后传不出来


 

指针引用数组元素,P233~235

★例S1214、求n个学生的平均年龄。

.int a[100],*P;// 用a[0]、a[1]、……、a[99]表示100个学生的年龄,

.int sum, average;//年龄总和,平均年龄

//求和

.p = a;//

.sum = 0;

.for(p=a;p<(a+n);p++)

      .sum = sum+*p;

★S1062,用指针方法排序.P244.

 

指向函数的指针P267

★用指针访问函数的方法重做上题,S1190

 

指针的动态内存分配,P287例8.30

例如生成一个int类型的指针变量

.int *p;

.p = (int *)malloc(sizeof(int));

要加头文件stdlib.h或malloc.h

★求n个学生的平均年龄,只能用指针。

n个学生的成绩变量用p = (int *)malloc(n*sizeof(int));定义.

 

自定义的结构(此内容是学线性表的关键):

主要操作:定义结构、声明结构变量、使用。

把整体作为一个数据,就是自定义的结构

如平面上的点(x,y),定义为

.struct point{

      .int x,y;

};

.struct point p1,*p2;//定义两个点,p2是指针变量

.p1.x = 3 ;//对点p1中的x赋值

.p2->x = 3 ;// 对点p2中的x赋值

★s1105、s1106、S1136、自选题。

 

二、    线性表

结构定义:含有数据元素和表长的自定义结构。

线性表的主要操作有:建表、求表长、输出、查询、插入、删除、合并等。

学法:先学会定义线性表所使用的结构,然后去实现一个个操作。

★S1178、S1179、S1180、S1181、S1182、S1194、S1205、S1206、S1207、S1208、S1209……

 

三、    链表

结构定义:含有数据元素和表长的自定义结构。

链表的主要操作有:建表、输出、查询、插入、删除、合并等。

★可用上面的习题练,双链表用s1213

学法:先学会定义链表所使用的结构,然后去实现一个个操作。

 

 

 

四、   考试样例

考试要求:本次考试内容为课本的1~3章;考试成绩占整个学期的30%;考试在OJ平台上开卷进行(只能带纸质材料);考试时用户账号与IP地址绑定(即一机只能有一号,一号只能在一机上使用);考试时间约3个小时左右;考试的题量是4~5题(算法、顺序表、线性表、应用等);出题的方式见10网工1班的期末考(在OJ的contest处

http://218.5.241.13:8060/oj/contest/showContest.jsp?id=64);不出与OJ完全一致的题(会改造);考试的卷面(代码格式)占5分;只对AC的题目给分;题型如下:

1、(算法题)设计一算法求a、b最大公约数(a、b<1000000000),要求算法时间复杂度小于O(n)。参考Smu1001。

2、(算法题)设计一算法找出1~n(n<10000000000)所有素数,要求算法时间复杂度小于O(n^2)。

3、(算法题)求整数1—n(n<1000000000) 的所有偶数的和,要求算法的时间复杂度O(1) 。

4、顺序表(见OJ上的习题)。

5、链表(见OJ上的习题)。

6、线性表应用,如多项式的合并、括号的匹配。Smu1058、Smu1098

7、线性表与算法的综合应用,如《数据结构》P65例1。

 

 

附代码风格:

}要单独一行;

{后不跟代码;

{}中的句首与}对齐;

赋值语句的=两边都要有一空格;

一行有多句,句间要有空格;

要有缩进,缩进的长度以Tab键产生为准;建议把代码全部选中,用Alt+F8自动调整。

每个函数块下或一个大的内容块下要加一行空行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值