回 帖 发 新 帖 刷新版面

主题:数据结构里创建链表的问题

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个回复)

沙发

能否拿出全部代码?

板凳

不好意思,我怕太长贴出来没人看。我现在就把只有问题的部分帖出来
 #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 楼


(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
说是一个段异常

我学数据结构到队列的时候也碰到这个问题,也到这里来问了,但是没解决,所以一直回避着这个问题,今天你到提醒了我,呵呵,再看看,最好是能一起解决!

4 楼

原来也一样啊……我还以为不同的电脑会不一样 ……这样的话想创建多个链表……

5 楼

呵呵,终于让我试出问题来了
解决了
简单的说段异常就是数组越界或者访问了一个不可访问的地址
或者访问了一个非法的地址

因为我们先前没有给结构提申请一个空间
所以会出现一个访问结构体地址空间的错误!


正确如下
[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 楼

你的意思是要为la和lb分配一个确定的地址吗??
这样的话La=(SqList*)malloc(sizeof(SqList)*LIST_INIT_SIZE);
改为La=(SqList*)malloc(sizeof(SqList);比较合理吧,然后再用InitList()分配空间。
不过我觉得InitList()里面的malloc函数就是分配空间跟产生地址的啊??我的理解不对??

7 楼

改为La=(SqList*)malloc(sizeof(SqList);合理
一时复制粘贴,手快了,你自己理解了就行

我们指定了一个结构体类型,想当于是一个模型
里面没有具体数据,系统对之也不分配实际内存单元

所以我们要访问里面的数据的时候,先要用malloc开辟一个结点
然后再对里面的数据进行操作

8 楼

很感谢你啊……这个问题我郁闷了好久。
算是理解了^_^

我来回复

您尚未登录,请登录后再回复。点此登录或注册