线性表动态分配顺序储存结构的几个问题

2024-12-26 08:27:15
推荐回答(1个)
回答1:

有三个问题:
(1)typedef int ElemType;在这里是什么含义,有什么用途,应该可以省去的吧?
不能省略,这是类型定义 有了此举 ElemType 就相当于 int
如省略,此句则报错 ElemType *elem;

(2)if(!L->elem)是什么含义,它和if(L->item==NULL)是等价的,但为什么写成这样if(!L->elem)?
一般来说 NULL都回定义成
#define NULL 0
NULL就是0
所以如果L->elem=NULL=0
则!L->elem=1;

(3)这段数据结构的算法是严蔚敏版的,但李春葆版却是:
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
两种算法最大的差异:李版的在初始化线性表时没有分配存储容量,以及在构造线性表时返回值类型为void型,这样可以吗?为什么?

李版在初始化的时候给分配了啊
L=(SqList *)malloc(sizeof(SqList)); 这句就是给链表分配存储容量,且他的元素个数是由数组data[MaxSize]的个数决定的,也就是MaxSize相当于 严版中的 LIST_INIT_SIZE

void 型可以,因为此时通过指针已经指向量表了
如 初始化调用
Sqlist *List
InitList(List)
这就生成了一张空表,同时List 是指向该表的指针
则该List和初始化函数 initList程序体中的L 是同名的,通过这样就建立连接。
严蔚敏版中返回 OK 只是一个链表建立成功的标志,而在李版里没有返回这样一个标志而已。

对于补充问题的回答
L是指向链表的一个指针,
而一个链表的结构由你的定义可知
typedef struct
{
ElemType *elem;
int length;
int listsize;
}
所以一个链表有三个成员
elem 链表存放数据的首地址
length 链表长度
listsize 链表占用的字节数
因此
L->length就可以得到链表的长度
L->listsize 就可以得到链表占用的字节数
L->elem就可以得到链表存放数据的首地址
继续看初始化函数
int InitList(SqList &L)
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
如果这句话成功了,就会gei链表分配一块LIST_INIT_SIZE*sizeof(ElemType)的存储空间,并把这快存储区域的首地址给 L-〉elem
如果分配内存空间不成功,L-〉elem就得不到任何数据,即为0,因此下一句就可以给出异常处理了
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}