线性表学习指导

 

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

本文所指的书《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区,su开头的是普通区。

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

一维数组:

★例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的矩阵,输出它们的和

  1. for(i=0;i<p;i )  
  2.   
  3.            {  
  4.   
  5.               for(j=0;j<q;j )  
  6.   
  7.                  printf("%d ",a[i][j] b[i][j]);  
  8.   
  9.               printf("\n");  
  10.   
  11.            }  


 


★选练:S1042、S1066、S1074

函数:P176

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

★S1110 求方差。

 

  1.  #include<stdio.h>   
  2.   
  3. double Avage(double a[100],int n)//求数组中n个数的平均数   
  4.   
  5. {  
  6.   
  7.     double avage = 0;  
  8.   
  9.     int i;  
  10.   
  11.     for (i=0;i<n;i )  
  12.   
  13.         avage  = a[i];  
  14.   
  15.     avage /=n;  
  16.   
  17.     return avage;  
  18.   
  19. }   
  20.   
  21. double ss(double tt,double b[100],int n)//求方差,tt是平均数   
  22.   
  23. {  
  24.   
  25.    int i;  
  26.   
  27.    double sum=0;  
  28.   
  29.    for(i=0;i<n;i )  
  30.   
  31.      sum =(tt-b[i])*(tt-b[i]);  
  32.   
  33.    sum/=n;  
  34.   
  35.    return sum;  
  36.   
  37. }  
  38.   
  39. void main()  
  40.   
  41. {  
  42.   
  43.    int t,n,i,j;  
  44.   
  45.    double data[100],ttt,s;  
  46.   
  47.    while(scanf("%d",&t)!=EOF)  
  48.   
  49.    {  
  50.   
  51.      for(i=0;i<t;i )  
  52.   
  53.      {  
  54.   
  55.         scanf("%d",&n);  
  56.   
  57.         for(j=0;j<n;j )  
  58.   
  59.         {  
  60.   
  61.           scanf("%lf",&data[j]);  
  62.   
  63.         }  
  64.   
  65.         ttt=Avage(data,n);//调用函数求平均数,   
  66.   
  67.         s=ss(ttt,data,n);//调用函数求方差   
  68.   
  69.         printf("s^2=%.2lf\n",s);  
  70.   
  71.      }  
  72.   
  73.    }  
  74.   
  75. }  



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

 

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

指针是变量的地址

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

  1. #include <stdio.h>   
  2.   
  3. int main(){  
  4.   
  5.       int *p1,*p2,*p,a,b;  
  6.   
  7.       scanf("%d%d",&a,&b);  
  8.   
  9.       p1 = &a;  
  10.   
  11.       p2 = &b;  
  12.   
  13.       if(a<b){  
  14.   
  15.            p = p1; p1 = p2; p2 = p;  
  16.   
  17.       }  
  18.   
  19.       printf("max=%d, min=%d\n",*p1,*p2);  
  20.   
  21.       return 0;  
  22.   
  23. }  


 

★    用指针完成S1004、S1010

 

指针作为函数的参数,P226

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

  1. void swap(int *p1, int *p2){  
  2.   
  3.    int temp;  
  4.   
  5.    temp = *p1;  
  6.   
  7.    *p = *p2;  
  8.   
  9.    *p2 = temp;  
  10.   
  11. }  


或:

  1. void swap(int *p1, int *p2){  
  2.   
  3.       int *p;  
  4.   
  5.       p = p1;  
  6.   
  7.       p = p2;  
  8.   
  9.       p2 = p;  
  10.   
  11. }  


 

指针引用数组元素,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个学生的平均年龄,只能用指针。

 

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

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

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

如平面上的点(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分;题型如下:

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自动调整。

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

阅读更多
想对作者说点什么? 我来说一句

应用数学基础学习指导

2010年01月02日 5.74MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭