小丑9 发表于 2023-3-6 20:14:43

为什么这里会显示异常


#include <stdio.h>
#include <stdlib.h>
#define ElemType int

//定义单链表
typedef struct LNode{
        ElemType data;
        LNode* next;
}LNode ,*LinkList;

//初始化不带头节点的单链表
void InitList_n(LinkList &l)
{
        l = NULL;
}

//尾插法建立不带头节点的单链表
void Establish_n(LinkList l,ElemType A[],int len)
{
        int i = 0;
        LNode* r = l, * s;
        while (i < len - 1)
        {
                s = (LNode*)malloc(sizeof(ElemType));
                s->data = A;
                if (NULL == r)
                {
                        r = l = s;
                        i++;
                        continue;
                }
                r->next = s;
                r = s;
                i++;
        }
        r->next = NULL;
}
int main()
{
        int A = { 0,1,2,3,4,5,6,7,8,9 };
        //声明一个不带头节点的单链表
        LinkList l;
        InitList_n(l);
        Establish_n(l, A, 10);


}

jhq999 发表于 2023-3-6 23:04:19

本帖最后由 jhq999 于 2023-3-6 23:10 编辑

#include <stdio.h>
#include <stdlib.h>
#define ElemType int

//定义单链表
typedef struct LNode{
      ElemType data;
      LNode* next;
}LNode ,*LinkList;

//初始化不带头节点的单链表
void InitList_n(LinkList &l)
{
      l = NULL;
}

//尾插法建立不带头节点的单链表
void Establish_n(LinkList &l,ElemType A[],int len)//////////&l
{
      int i = 0;
      LNode* r=l,* s;
      while (i < len - 1)
      {
                s = (LNode*)malloc(sizeof(ElemType));
                s->data = A;
                if (NULL == r)
                {
                        r=l = s;

                        i++;
                        continue;
                }
                r->next = s;
                r = s;
                i++;
      }
      r->next = NULL;
}
int main()
{
      int A = { 0,1,2,3,4,5,6,7,8,9 };
      //声明一个不带头节点的单链表
      LinkList l;
      InitList_n(l);
      Establish_n(l, A, 10);
      LinkList p=l;
      while(p)
      {
            printf("%d ",p->data);
            p=p->next;

      }

}
MMP刚刚把尾插法看成头插法了

cjgank 发表于 2023-3-7 10:18:30


//定义单链表
typedef struct LNode{
      ElemType data;
      LNode* next;
}LNode ,*LinkList;

LNode* r = l, * s;
s = (LNode*)malloc(sizeof(ElemType));


LNode *s 指针的地址不应该是4字节吧?那么你强制转换4字节为(LNode *) 可不就造成空间破坏

你或许应该这样做:

s = (LNode*)malloc(sizeof(LNode));

微光拼图 发表于 2023-3-7 11:33:41

jhq999 发表于 2023-3-6 23:04
MMP刚刚把尾插法看成头插法了

所以楼主问的堆损坏是为什么呢?

jhq999 发表于 2023-3-7 11:56:22

本帖最后由 jhq999 于 2023-3-7 12:07 编辑

微光拼图 发表于 2023-3-7 11:33
所以楼主问的堆损坏是为什么呢?

3楼不是说了吗?{:5_109:} ,主要还是我眼瞎了,编译器警告设低了

小丑9 发表于 2023-3-7 12:10:35

cjgank 发表于 2023-3-7 10:18
LNode *s 指针的地址不应该是4字节吧?那么你强制转换4字节为(LNode *) 可不就造成空间破坏

你或 ...

原来如此,那为什么前两次循环就没有异常呢;还有第18行那里传入的参数 l 不是一个指针吗,那为什么还要用引用?

jhq999 发表于 2023-3-8 07:02:33

小丑9 发表于 2023-3-7 12:10
原来如此,那为什么前两次循环就没有异常呢;还有第18行那里传入的参数 l 不是一个指针吗,那为什么还要 ...

不用引用,子函数里的形参l=s;而主函数的实参l不变,不等于第一个s

小丑9 发表于 2023-3-8 11:36:04

jhq999 发表于 2023-3-8 07:02
不用引用,子函数里的形参l=s;而主函数的实参l不变,不等于第一个s

那为什么传参的时候是一个数组的时候就可以不用引用呢?

jhq999 发表于 2023-3-8 12:24:55

本帖最后由 jhq999 于 2023-3-8 12:31 编辑

小丑9 发表于 2023-3-8 11:36
那为什么传参的时候是一个数组的时候就可以不用引用呢?

先搞明白实参不随形参改变而改变;
主函数里的l和子函数里的参数l是两个变量
当叫到子函数时,是把主函数变量l的值赋值给了子函数的参数l,
所以子函数里改变子函数l的值;而主主函数里的l没有改变还是NULL



页: [1]
查看完整版本: 为什么这里会显示异常