新手,遇到指针方面的问题,
按我观察的,在InitList函数中申请了头结点的内存,并将头结点的指针域赋值为NULL,但是不知为何退出InitList函数之后头结点的next就不是NULL了,导致在AddNode_R函数中将pr指针移动链表尾的操作导致错误。
在这里先谢谢各位了.
//#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
const int OK = 1;
const int ERROR = 0;
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
int InitList(LinkList *head);
int AddNode_R(LinkList *head);
int main()
{
LinkList *L;
InitList(L);
printf("--------------------------------------\n");
while(1)
{
printf("是否申请新的节点(y/n):");
if(getchar()=='y')
{
AddNode_R(L);
}
if(getchar()=='n')
{
}
}
system("pause");
return 0;
}
int InitList(LinkList *head)
{
head = (LinkList *)malloc(sizeof(LinkList)); //生成新的节点作为头结点,用头指针Head作为头结点
if (head == NULL)
{
printf("没有足够的内存!\n");
exit(1);
}
head->next = NULL; //防止指针乱指
return OK;
}
int AddNode_R(LinkList *head) //后插添加节点,每次插入一个节点
{
LinkList *pr = head; //移动节点
LinkList *p = NULL; //新指针
p = (LinkList *)malloc(sizeof(LinkList)); //新节点,为了防止错误(下一步),要与定义部分分开,
if (p == NULL) //防止错误
{
printf("没有足够的内存\n");
exit(0);
}
p->next = NULL; //防止错误
//此处出错,为什么在上一个函数退出回到main,head-next会增加1个位置尾0x01,明明在InitList最后将head-next赋值为NULL
while (pr->next != NULL) //移动指针到尾部
{
pr = pr->next;
}
pr->next = p; //新节点连接在尾节点之后
//数据输入区域(可修改)
int data;
printf("请输入节点数据(int):");
scanf("%d", &data);
p->next = NULL; //防止出错
return OK;
}
int InitList(LinkList **head)
{//必须是二级指针,和传值传地址那个一个道理,只不过这里是指针而已
*head = (LinkList *)malloc(sizeof(LinkList)); //生成新的节点作为头结点,用头指针Head作为头结点
if (*head == NULL)
{
printf("没有足够的内存!\n");
exit(1);
}
(*head)->next = NULL; //防止指针乱指
return OK;
}
朋友,问题不是出在AddNode_R这个函数,而是你的InitList函数有问题。
InitList(LinkList *head)函数中head并不是L,所以里面的所有操作是对head做的,跟L无关。因为你只是创建了head指向L,当函数结束时head就被释放了,而L依然为NULL(你原本的写法L不指向任何东西,我改成指向NULL了)。
因此要改变 InitList函数,于是我将InitList变为了返回值为LinkList的函数,这样在main中创建链表L,调用初始化函数返回一个指针头,用于给L初始化,这样你的链表头就能创建了。
以下是帮你改的,注释*******的地方是我改过的
//#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
const int OK = 1;
const int ERROR = 0;
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
LinkList* InitList();//**************************************************************
int AddNode_R(LinkList *head);
int main()
{
LinkList *L=NULL;//****************************************************************************************
L = InitList();//**************************************************************
printf("--------------------------------------\n");
while (1)
{
printf("是否申请新的节点(y/n):");
if (getchar() == 'y')
{
AddNode_R(L);
}
if (getchar() == 'n')
{
}
}
system("pause");
return 0;
}
LinkList * InitList()//***********************************************
{
LinkList *head=NULL;//***********************************************
head = (LinkList *)malloc(sizeof(LinkList*)); //***********************************************
if (head == NULL)
{
printf("没有足够的内存!\n");
exit(1);
}
head->next = NULL;
return head;//***********************************************
}
int AddNode_R(LinkList *head)
{
LinkList *pr = head;
LinkList *p = NULL;
p = (LinkList *)malloc(sizeof(LinkList));
if (p == NULL)
{
printf("没有足够的内存\n");
exit(0);
}
p->next = NULL;
while (pr->next != NULL)
{
pr = pr->next;
}
pr->next = p;
int data;
printf("请输入节点数据(int):");
scanf_s("%d", &p->data);//*************************************************************************************
p->next = NULL;
return OK;
}