C语言(数据结构)顺序表的初始化

以下是我写的两个顺序表的小程序,可是我有点迷糊了,顺序表的初始化,需不需要申请结点空间呀?我觉得申请了好像没什么用啊?
程序一(申请了结点空间)

#include<stdio.h>
#include"malloc.h"
#define MAX 50

typedef struct
{ int data[MAX];
int length;

}Sqlist;
//顺序表的初始化
Sqlist InitSqlist()
{
Sqlist *a;
a=(Sqlist *)malloc(sizeof(Sqlist));//这里申请了结点空间
a->length=0;
return *a;
}

int Listinsert(Sqlist &L,int i,int e)
{
int j;
if(i<1||i>L.length+1) return 0;
for(j=L.length-1;j>=i-1;j--)
L.data[j+1]=L.data[j];
L.data[i-1]=e;
L.length++;
return 1;
}
void main(){
Sqlist L;
L=InitSqlist();
//测试插入
printf("测试插入");
Listinsert(L,1,12);
}

程序二(未申请结点空间):

#include<stdio.h>
#include"malloc.h"
#define MAX 50

typedef struct
{ int data[MAX];
int length;

}Sqlist;

//顺序表的初始化(这里边没有申请结点空间)

Sqlist InitSqlist()
{
Sqlist a;
a.length=0;
return a;
}

int Listinsert(Sqlist &L,int i,int e)
{
int j;
if(i<1||i>L.length+1) return 0;
for(j=L.length-1;j>=i-1;j--)
L.data[j+1]=L.data[j];
L.data[i-1]=e;
L.length++;
return 1;
}
void main(){
Sqlist L;
L=InitSqlist();
//测试插入
printf("测试插入");
Listinsert(L,1,12);

}

为何这两个程序测试都没有错误呀?顺序表到底需不需要申请结点空间呀?

肯定是要分配空间的,你第一个程序的initsqlist函数中声明的结构体指针(Sqlist *a;),而第二个程序的initsqlist函数中是声明的结构体(Sqlist a;),前者只是在计算机内存中声明一个指针,而不会给这个指针分配内存空间,所以你初始化的时候要给这个指针用malloc函数分配空间,而后者是实实在在的定义了一个结构体,在内存在不仅仅是一个地址,还分配了空间,就像你定义了一个数组一样,已经在内存存在空间了,不需要再分配了。
总体来说就是你定义的是指针的话就要分配空间。

你的2个程序都是对的,但是一般用第一种定义链表!!!追问

谢谢,我在第一个中已经定义了数组,就相当于有了一些结点,那再申请结点不是多余吗?

追答

你在第一个程序中定义了结构体,结构体的成员有一个是数组,但是你没有向内存申请空间,
typedef struct
{ int data[MAX];
int length;
}Sqlist;
这段语句只是单纯的定义一个结构体,给这个结构体去取一个别名,后面的
Sqlist a;才是正式的向内存申请空间。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-04-05

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类型即可。

本回答被网友采纳
第2个回答  2012-09-20
SeqList *Init_SeqList(){//函数返回初始化后的顺序表结构指针,没有传入参数
SeqList *L;//定义顺序表结构指针
L=(SeqList *)malloc(sizeof(SeqList));//申请头顺序表,为它在堆中分配内存
L->last = -1;//last指向顺序表中最后一个元素的位置,从0开始;这里-1表示顺序表当前没有内容
return L;//返回顺序表结构指针
}
Main(){
SeqList *L;//定义顺序表结构指针,用来保存顺序表结构
L=Init_SeqList();//调用函数得到顺序表指针
……
}
第3个回答  2013-11-14
你的SqList结构包含的元素是一个100个int类型的数组,和一个int变量。
在初始化函数中,首先参数sqlist *L,应该改成Sqlist *L
然后你给L->Elem_array进行赋值操作是不对的,因为Elem_array是数组首地址,是个常量,不能进行赋值操作。而且本身结构里面定义的是数组元素,所以已经有空间了,根本不需要再另外申请内存。如果需要动态申请内存,就把Elem_array声明为指针类型:ElemType *pElem_array
第4个回答  2012-09-03
分配空间的位置不当,你应该在插入节点的地方分配空间,分配空间是用在原来或者本身因为相关操作空间不足,所以需要分配空间。你写的这个程序不需要要分配空间了,因为你已经定义了data[20]这个里面已经有了20个这样的空间了,你目前的操作完全够用的。如果定义成*data,就要分配空间了。追问

也就是说用数组存储元素的不需要申请结点空间对吗?数组就相当于结点空间了,而对于像单链表因为不是用数组存储的,所以需要申请结点空间来存储元素和指针对吗?

还有一个问题:
那我上边写的第二个程序才是正确的对吗?第一个程序没必要申请结点空间对吗?

追答

typedef struct {T data;Node *next;} Node;这种写法的时候每次增加节点的时候需要去分配空间;抱歉因为前面的回答是手机上看的回答,有点答非所问。 分配空间一般是给指针变量分配的,普通变量并不需要,上面的你的两个程序差不多是一个意思,都是使用的一个节点,然后使用里面的data数组。其实你这种写法是有问题的,你是链表初始化,什么是链表 它是条可以无限延伸的链子,每个节点里面储存着你的数据,而不是一个节点里面来个数组 ,就能长度length++;你计算的可不是节点长度,而是这个data数组中存了几个数了。 因为这台机子没有VS2008不好写程序,简单写下希望能帮到你。int Listinsert(Sqlist &L,int i,int e){for(i=0;i<num;i++){这个时候每循环一次分配一次节点空间,然后再往里面插入数据,同时链表的长度+1}}

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; \/...

C语言(数据结构)顺序表的初始化
肯定是要分配空间的,你第一个程序的initsqlist函数中声明的结构体指针(Sqlist *a;),而第二个程序的initsqlist函数中是声明的结构体(Sqlist a;),前者只是在计算机内存中声明一个指针,而不会给这个指针分配内存空间,所以你初始化的时候要给这个指针用malloc函数分配空间,而后者是实实在在的定...

C语言数据结构顺序表初始化
C数据结构的基础是指针。好好花上几天时间把指针搞懂再来学数据结构会事半功倍。include <stdlib.h> include <stdio.h> define MAX_SIZE 100 define OK 0 define ERROR -1 typedef struct tagSqList { int element[MAX_SIZE];unsigned size;} SqList;int Initial(SqList *pL) \/\/ 定义指针变量...

顺序表的初始化
define MAXSIZE 100 typedef struct { int data[MAXSIZE];int len;}SqList;\/\/ 初始化线性表运算 void InitList(SqList *sq){ (*sq).len=0;} \/\/ 求线性表长度运算 int GetLength(SqList sq){ return sq.len;} \/\/ 求线性表中的第i个元素的运算 int GetElem(SqList sq,int i){ if(...

简述顺序表的初始化操作和插入操作的过程,计算顺序表插入过程的时间复杂...
Pi(n-i+1)指的是插入i元素以后,需要移动的元素的个数,在第一个元素后面插入元素i需要移动n个元素,在第二个元素后面插入元素i需要移动元素(n-1)个元素;依此论推,在第n个元素后面插入元素i需要移动1个元素,这是一个等差数列,首项为n,公差为1,最后一项是1,求和以后需要除以(n+1)...

数据结构顺序表的初始化,这个错误怎么改
malloc返回的指针是void *类型,需要转换类型:L->element = (ElemType *)malloc(sizeof(ElemType)*mSize);另外,你这程序写得还是很规范的,赞一下!

谁懂数据结构C语言,帮个忙吧,我整了好久都没整好,会的帮我一下谢了
\/*顺序表的初始化*\/ SeqList *init_SeqList(){ SeqList *L;L=malloc(sizeof(SeqList));L->last=-1;return L;} \/*插入数据*\/ void Insert_SeqList(SeqList *L,int i,int x){ int j;if(L->last==MAXSIZE-1){ printf("full "); \/*表空间已满无法插入*\/ exit(0) ;} if(...

详解顺序表
首先,让我们定义顺序表的基本结构:结构体定义:```htmldata (数据): 一个连续的整型数组 length (长度): 当前存储元素的数量 maxSize (最大容量): 序列表的预设最大存储元素数 ```初始化顺序表的过程至关重要,它分配连续内存,初始化长度和容量:初始化函数:```htmlvoid initSeqList(SeqList...

数据结构c语言版一道题求解
,element[n - 1]存放线性表中的元素 *\/}; typedef struct SeqList *PSeqList;PSeqList createNullList_seq(int m ) {\/* 创建新的顺序表 *\/ PSeqList palist= (PSeqList)malloc(sizeof(struct SeqList)); if (palist!=NULL){ palist->element= (DataType*)malloc(size...

数据结构 用C语言实现顺序表的建立及遍历
include <stdio.h>#include <malloc.h>typedef struct nlist{ int *np; int len;\/\/已使用地址个数 int maxlen;\/\/最大地址个数}NLT;NLT *createlist();\/\/创建顺序表int addtolist(NLT *nlist);\/\/向顺序表插入元素void pList(NLT *nlist);\/\/遍历顺序表int main(){ int i...

相似回答