C语言越界访问问题

请问错在哪里?怎么改?
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* next;
}LinkList,*pLinkList;
pLinkList Create_LinkList();
void reverse_LinkList(pLinkList);
int main()
{
pLinkList H;
H = Create_LinkList();
for(int i = 0;i<3;i++)
{
pLinkList T;
T = (pLinkList)malloc(sizeof(LinkList));
T->data = i;
H->next = T;
H = H->next;
}
reverse_LinkList(H);
return 0;
}
pLinkList Create_LinkList()
{
pLinkList H;
H = (pLinkList)malloc(sizeof(LinkList));
if(H)
{
H->next = NULL;
}
return H;
}
void reverse_LinkList(pLinkList H)
{
pLinkList p,q;
p = H->next;
H->next = NULL;
while(p)
{
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
}
好像是while循环里的问题

第1个回答  2019-10-02
问题出在reverse函数的第二行,你的H在传入时已经是最后加入的元素了(列表尾),你再把它赋值为它的next,也就是队尾的下一个,会指向一个未定义的地方,因此会出现这样的问题追答

而且你的H表意不明,按照你的意思,H应该是链表头,但是你在创建链表的同时却不停的在加入新元素时将加入的元素赋给H。另外,reverse函数中的p=H->next,根据我刚刚说的,H本身就是队尾,H->next是一个未定义的地址,你又把它赋值给p,所以p一开始就已经不是链表的一部分(可能为0(NULL)也可能不是,因为你的链表接点是malloc出来的而且没初始化所有成员变量为0),再while(p)就会出问题

第2个回答  2019-10-02
H指针应始终指向头部,不应被修改,增减变量p指针用于操作
int main()
{
pLinkList H,p;
H = Create_LinkList();
p = H;
for (int i = 0; i < 3; i++)
{
pLinkList T;
T = (pLinkList)malloc(sizeof(LinkList));
T->data = i;
p->next = T;
p = p->next;
}
reverse_LinkList(H);
return 0;
}追问

好像还是无法运行

追答

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{

    int data;

    struct node* next;

} LinkList, *pLinkList;

pLinkList Create_LinkList();

void reverse_LinkList(pLinkList);

void print_LinkList(pLinkList);

int main()

{

    pLinkList H, p;

    H = Create_LinkList();

    p = H;

    for (int i = 0; i < 3; i++)

    {

        pLinkList T;

        T = (pLinkList)malloc(sizeof(LinkList));

        T->data = i;

        p->next = T;

        p = p->next;

    }

    print_LinkList(H);

    reverse_LinkList(H);

    print_LinkList(H);

    return 0;

}

pLinkList Create_LinkList()

{

    pLinkList H;

    H = (pLinkList)malloc(sizeof(LinkList));

    if (H)

    {

        H->next = NULL;

    }

    return H;

}

void reverse_LinkList(pLinkList H)

{

    pLinkList p, q;

    p = H->next;

    H->next = NULL;

    while (p)

    {

        q = p;

        p = p->next;

        q->next = H->next;

        H->next = q;

    }

}

void print_LinkList(pLinkList p)

{

    for (p = p->next; p != NULL; p = p->next)

    {

        printf("%d ", p->data);

    }

    printf("\n");

}

本回答被网友采纳
相似回答