肯定是要分配空间的,你第一个程序的initsqlist函数中声明的结构体指针(Sqlist *a;),而第二个程序的initsqlist函数中是声明的结构体(Sqlist a;),前者只是在计算机内存中声明一个指针,而不会给这个指针分配内存空间,所以你初始化的时候要给这个指针用malloc函数分配空间,而后者是实实在在的定义了一个结构体,在内存在不仅仅是一个地址,还分配了空间,就像你定义了一个数组一样,已经在内存存在空间了,不需要再分配了。
总体来说就是你定义的是指针的话就要分配空间。
你的2个程序都是对的,但是一般用第一种定义链表!!!
C语言(数据结构)顺序表的初始化需要申请结点空间。
初始化顺序表
1、/**
2、 * 初始化顺序表
3、 * 返回1 表示初始化成功
4、* 返回0 表示初始化失败
5、*/
6、int initList_sq(SqList &L) { //只有在C++中才会有引用的存在
7、 L.elem = (SeqType *) malloc(sizeof(SeqType) * LIST_INIT_SIZE);
8、 if (!L.elem)
9、 return 0; //内存分配失败,存储空间不够
10、 L.length = 0; //表示顺序表为空
11、 L.listsize = LIST_INIT_SIZE; //表示顺序表里,最大存储单元个数
分配顺序表的存储单元,初始化顺序表属性的值。
定义结构
typedef int SeqType; //存储单元类型
typedef struct{
SeqType *elem; //存储空间基地址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
结构体内,有三个元素:存储空间基地址,类似于数组首地址;当前长度,记录顺序表中有效存储单元个数;当前分配的存储容量,顺序表中,最多容纳的存储单元个数。当顺序表中所有存储单元已经被使用,在下次插入元素之前,需要新增存储单元。这点是数组所不具有的特性。
*注:定义一个存储单元类型SeqType是为了使顺序表适和更多数据类型,使用的时候修改SeqType类型即可。
SeqList *Init_SeqList(){//函数返回初始化后的顺序表结构指针,没有传入参数
SeqList *L;//定义顺序表结构指针
L=(SeqList *)malloc(sizeof(SeqList));//申请头顺序表,为它在堆中分配内存
L->last = -1;//last指向顺序表中最后一个元素的位置,从0开始;这里-1表示顺序表当前没有内容
return L;//返回顺序表结构指针
}
Main(){
SeqList *L;//定义顺序表结构指针,用来保存顺序表结构
L=Init_SeqList();//调用函数得到顺序表指针
……
}
你的SqList结构包含的元素是一个100个int类型的数组,和一个int变量。
在初始化函数中,首先参数sqlist *L,应该改成Sqlist *L
然后你给L->Elem_array进行赋值操作是不对的,因为Elem_array是数组首地址,是个常量,不能进行赋值操作。而且本身结构里面定义的是数组元素,所以已经有空间了,根本不需要再另外申请内存。如果需要动态申请内存,就把Elem_array声明为指针类型:ElemType *pElem_array
分配空间的位置不当,你应该在插入节点的地方分配空间,分配空间是用在原来或者本身因为相关操作空间不足,所以需要分配空间。你写的这个程序不需要要分配空间了,因为你已经定义了data[20]这个里面已经有了20个这样的空间了,你目前的操作完全够用的。如果定义成*data,就要分配空间了。