为什么已经用malloc分配空间了还是显示异常访问冲突


#include"stdio.h"
#include"stdlib.h"
typedef struct node
{
    int data;//结点所对应的数据
    struct node* Next;//指向下一个结点的指针next
}l, * list;
list H;
list makebiao(int n)//n为元素个数
{
    int i;
    list H;
    H = (list)malloc(sizeof(l));
    H->Next= (list)malloc(sizeof(l));
    H->data = 0;
    list p = H->Next;
    p->Next= (list)malloc(sizeof(l));
    for (i = 1; i < n; i++)
    {
        p->data = i;
        p = p->Next;
    }
    return H;
}
void destroy(list* H)
{
    list p, q;
    p = *H;
    while (p)
    {
        q = p;
        p = p->Next;
        free(q);
    }
    *H = NULL;
}
list insert(list H, int x)
{
    list p, q;
    p = (list)malloc(sizeof(l));
    q = (list)malloc(sizeof(l));
    for (p = H; p->Next->data <= x; p = p->Next)
    {
    }
    q->data = x;
    q->Next = p->Next;
    q = p->Next;
    return H;
}
void putbiao(list H)
{

    while (H)
    {
        printf("%d\t", H->data);
        H = H->Next;
    }
}
int main()
{

    list H;
    H = makebiao(99);
    putbiao(H);
    insert(H, 5);
    putbiao(H);
    destroy(&H);
            return 1;
}

报错图片

img


用的是VS2019

修改如下,改动处见注释,供参考:

#include"stdio.h"
#include"stdlib.h"
typedef struct node
{
    int data;//结点所对应的数据
    struct node* Next;//指向下一个结点的指针next
}l, * list;
list H;
list makebiao(int n)//n为元素个数
{
    int i;
    list H;
    H = (list)malloc(sizeof(l));
    H->Next = NULL;  //H->Next= (list)malloc(sizeof(l)); 修改
    H->data = 0;
    list p = H;      // list p = H->Next;                修改
                     //p->Next= (list)malloc(sizeof(l)); 修改
    for (i = 1; i <= n; i++) // for (i = 1; i < n; i++)  修改
    {
        p->Next = (list)malloc(sizeof(l));
        p->Next->Next = NULL;
        p->Next->data = i;
        p = p->Next;
    }
    return H;
}
void destroy(list* H)
{
    list p, q;
    p = *H;
    while (p)
    {
        q = p;
        p = p->Next;
        free(q);
    }
    *H = NULL;
}
list insert(list H, int x)
{
    list p, q;
    p = NULL;     //p = (list)malloc(sizeof(l));   修改
    q = (list)malloc(sizeof(l));
    q->data = x;
    for (p = H; p->Next && p->Next->data <= x; p = p->Next); // 修改
    // for (p = H; p->Next->data <= x; p = p->Next)
    q->Next = p->Next;
    p->Next = q; //q = p->Next;  修改
    return H;
}
void putbiao(list H)
{
    H = H->Next; // 修改
    while (H)
    {
        printf("%d\t", H->data);
        H = H->Next;
    }
}
int main()
{
 
    list H;
    H = makebiao(99);
    putbiao(H);
    insert(H, 5);
    putbiao(H);
    destroy(&H);
    return 1;
}

for 循环中没malloc

【以下回答由 GPT 生成】

在你的代码中出现了异常访问冲突的问题是因为你在makebiao函数中没有正确地设置链表的结构。在该函数中,你将第一个结点作为头结点,并分配了两个额外的结点,但是没有正确连接它们。

以下是对于你代码中出现问题的地方进行修正的具体步骤:

  1. 在makebiao函数中,将H->Next的分配和设置移动到for循环开始处,并将H->data的赋值从循环内移到循环前。

修正后的代码如下:

c list makebiao(int n) { list H; H = (list)malloc(sizeof(l)); H->data = 0; list p = H; for (int i = 1; i < n; i++) { p->Next = (list)malloc(sizeof(l)); p->Next->data = i; p = p->Next; } p->Next = NULL; return H; }

  1. 在insert函数中,为p和q分配内存空间的语句可以省略。

修正后的代码如下:

c list insert(list H, int x) { list p, q; q = (list)malloc(sizeof(l)); for (p = H; p->Next != NULL && p->Next->data <= x; p = p->Next) { // 在这里查找插入位置 } q->data = x; q->Next = p->Next; p->Next = q; return H; }

完成以上修正后,重新运行程序应该不会再出现异常访问冲突的问题。

最终修正后的完整代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data; // 结点所对应的数据
    struct node* Next; // 指向下一个结点的指针next
} l, *list;

list makebiao(int n) {
    list H;
    H = (list)malloc(sizeof(l));
    H->data = 0;
    list p = H;
    for (int i = 1; i < n; i++) {
        p->Next = (list)malloc(sizeof(l));
        p->Next->data = i;
        p = p->Next;
    }
    p->Next = NULL;
    return H;
}

void destroy(list* H) {
    list p, q;
    p = *H;
    while (p) {
        q = p;
        p = p->Next;
        free(q);
    }
    *H = NULL;
}

list insert(list H, int x) {
    list p, q;
    q = (list)malloc(sizeof(l));
    for (p = H; p->Next != NULL && p->Next->data <= x; p = p->Next) {
        // 在这里查找插入位置
    }
    q->data = x;
    q->Next = p->Next;
    p->Next = q;
    return H;
}

void putbiao(list H) {
    while (H) {
        printf("%d\t", H->data);
        H = H->Next;
    }
}

int main() {
    list H;
    H = makebiao(99);
    putbiao(H);
    insert(H, 5);
    putbiao(H);
    destroy(&H);
    return 1;
}

请尝试使用修正后的代码运行程序,应该可以成功解决异常访问冲突的问题。如有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^