版权声明:原创的东西,转载时留个标记。 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语言的把握不到位,对地址,指针的理解不到位,所以,请按照课程的要求,务必修好先行课程再来学数据结构,不然你又要怀疑人生且出言不逊了。