关于严蔚敏老师《数据结构(C语言版)》书中代码的误解 您所在的位置:网站首页 C语言代码报错 关于严蔚敏老师《数据结构(C语言版)》书中代码的误解

关于严蔚敏老师《数据结构(C语言版)》书中代码的误解

2024-06-16 19:05| 来源: 网络整理| 查看: 265

清华大学严蔚敏老师的《数据结构(C语言版)》以其严谨被奉为经典,我是从其Pascal版一路追着买到C语言版,一直觉得这本书理论功力深厚,是不可多得的数据结构教材。但其编写过程中为避免太过拘泥于具体语言细节,使用了ADT描述,具体算法中使用了伪码描述,对于新手直接把代码原样照抄是没法直接在电脑运行的,也就验证不了书本上的代码执行效果,因而有人说严老师写的不中不洋,不神不鬼,看到这些评论,我只想说,那是你根本没有完整看通整本书,更没有学好C语言,下面我就其中几个细节演示下如何将书上代码上机.

一、关于预定义变量。

第一个例子,书上23页,线性表的初始化。

/初始化线性表 Status Init_Sqlist(sqlist *L) { L->elem=(ElemType *)malloc(lIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem) return OVERFLOW; else { L->Length=0; L->ListSize=lIST_INIT_SIZE; return OK; }

以上代码是初始化线性表的书上原码,如果照抄到C里,肯定会报错,因为其中的Status、OVERFLOW、OK都是未定义的,但你把书翻到第10页,你看他上面有什么,预定义常量和类型呀。

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; //函数类型,其值是函数结果状态码 typedef int ElemType; //数据类型

你把这组定义加进去,再把下面的结构体声明加进去,你看他到底能不能跑?

#define lIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { ElemType *elem; int ListSize; int Length; }sqlist;

有人说你这代码跟书上还是不一样呀?对的,书上使用的是&L,我这里用的是*L,因为我是在纯C里跑,你要是在C++里跑,照抄也行,在C里运行,就要做一点变通。对于结构体的引用,书上用的是“.',我用的是”->“,但你要是定义的是指针,这两种搞法都没问题。

二、关于引用(&)和指针(*)。

第二个例子,线性表中指定删除,书上第24页。

Status ListDelete_Sqlsit(sqlist *L,int i,ElemType *e) { ElemType *p,*q; int k; if(L->Length==0) { printf("Empty List."); return ERROR; } if(iL->Length) { printf("illegal place."); return ERROR; } p=&(L->elem[i-1]); e=p; ///* 书上原句,原以为有问题,实际上是指针变量不会定义,囧。 q=L->elem+L->Length-1; for(++p;pelem[k]=L->elem[k+1]; } */ --L->Length; return OK; }

以上代码是做过修改后的,实际上也就是对所用的变量做了一个明确定义,比如下面这一行,

ElemType *p,*q;

然后将下面原书函数中的&引用全部重新定义成指针*。

Status ListDelete_Sqlsit(sqlist &L,int i,ElemType &e)

        归根到底,还是对C语言的把握不到位,对地址,指针的理解不到位,所以,请按照课程的要求,务必修好先行课程再来学数据结构,不然你又要怀疑人生且出言不逊了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有