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

版权声明:原创的东西,转载时留个标记。 https://blog.csdn.net/laguoqing/article/details/84825613

清华大学严蔚敏老师的《数据结构(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(i<1||i>L->Length) 
	      	 {
    		printf("illegal place.");
    		return ERROR;
         }
	p=&(L->elem[i-1]);
	e=p;
	
	///*  书上原句,原以为有问题,实际上是指针变量不会定义,囧。 
	q=L->elem+L->Length-1;
	for(++p;p<=q;++p) *(p-1)=*p;
	//*/
	
	/* 文都洪教授的写法,其实也可行,就是没深度。 
	for(k=i;k<L->Length;k++)
		{
		L->elem[k]=L->elem[k+1];
		}
  */
	--L->Length;
	return OK;
}

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

ElemType *p,*q;

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

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

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

猜你喜欢

转载自blog.csdn.net/laguoqing/article/details/84825613
今日推荐