主题:数据结构里创建链表的问题
梁某
[专家分:210] 发布于 2006-11-28 15:50:00
Status InitList (SqList *L)
{
(*L).elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if (!L)
return ERROR;
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
这个是创建链表的函数,当我定义SqList *L,*q时。
程序里创建一个链表就成功(InitList (L);)
但创建两个的时候就老弹出遇到问题要关闭的窗口(InitList (L);InitList (q);)
这个是什么原因啊??可以如何解决??
是空间不够??[em10]
回复列表 (共8个回复)
沙发
xieyong456 [专家分:2620] 发布于 2006-11-28 16:14:00
能否拿出全部代码?
板凳
梁某 [专家分:210] 发布于 2006-11-28 16:25:00
不好意思,我怕太长贴出来没人看。我现在就把只有问题的部分帖出来
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 10
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList (SqList *);
[color=FF0000] int main (void)
{
int i;
ElemType e;
SqList *La,*Lb;
InitList (La);
InitList (Lb);
} [/color]
Status InitList (SqList *L)
{
(*L).elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if (!L)
return ERROR;
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
主函数那里如果只创建了一次链表(没Lb)就没问题,创建两个就有错误要关闭的提示了。
3 楼
xieyong456 [专家分:2620] 发布于 2006-11-28 16:44:00
(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
说是一个段异常
我学数据结构到队列的时候也碰到这个问题,也到这里来问了,但是没解决,所以一直回避着这个问题,今天你到提醒了我,呵呵,再看看,最好是能一起解决!
4 楼
梁某 [专家分:210] 发布于 2006-11-28 16:49:00
原来也一样啊……我还以为不同的电脑会不一样 ……这样的话想创建多个链表……
5 楼
xieyong456 [专家分:2620] 发布于 2006-11-28 17:15:00
呵呵,终于让我试出问题来了
解决了
简单的说段异常就是数组越界或者访问了一个不可访问的地址
或者访问了一个非法的地址
因为我们先前没有给结构提申请一个空间
所以会出现一个访问结构体地址空间的错误!
正确如下
[b]code[/b]
-------------------------------------------------------------------
#include <stdio.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 10
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList (SqList *L);
int main (void)
{
int i;
ElemType e;
SqList *La,*Lb;
La=(SqList*)malloc(sizeof(SqList));
InitList (La);
Lb=(SqList*)malloc(sizeof(SqList));
InitList (Lb);
}
Status InitList (SqList *L)
{
(*L).elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if (!L)
return ERROR;
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
---------------------------------------------------------------------
6 楼
梁某 [专家分:210] 发布于 2006-11-28 17:42:00
你的意思是要为la和lb分配一个确定的地址吗??
这样的话La=(SqList*)malloc(sizeof(SqList)*LIST_INIT_SIZE);
改为La=(SqList*)malloc(sizeof(SqList);比较合理吧,然后再用InitList()分配空间。
不过我觉得InitList()里面的malloc函数就是分配空间跟产生地址的啊??我的理解不对??
7 楼
xieyong456 [专家分:2620] 发布于 2006-11-28 17:57:00
改为La=(SqList*)malloc(sizeof(SqList);合理
一时复制粘贴,手快了,你自己理解了就行
我们指定了一个结构体类型,想当于是一个模型
里面没有具体数据,系统对之也不分配实际内存单元
所以我们要访问里面的数据的时候,先要用malloc开辟一个结点
然后再对里面的数据进行操作
8 楼
梁某 [专家分:210] 发布于 2006-11-28 18:00:00
很感谢你啊……这个问题我郁闷了好久。
算是理解了^_^
我来回复