帮我看看一个链表的程序
刚写了几个函数就指针出错,找不到错误,请高手给看看
编译环境 vc++2005
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include"stdlib.h"
enum Status {OK,ERROR};
typedef int ElemType;
typedef struct LNode
{
ElemType elem;
struct LNode *next;
} Node;
typedef struct
{
Node *head;
Node *tail;
int length;
} LinList;
void MakeNode(Node *pNode,ElemType e)
{
pNode=(Node*)malloc(sizeof(Node));
pNode->next=NULL;
pNode->elem=e;
}
void Free(Node *pNode)
{
}
void InitList(LinList *pList)
{
MakeNode(pList->head,0);
pList->tail=pList->head;
pList->length=0;
}
void ClearList(LinList *pList)
{
pList->length=0;
}
void DestroyList(LinList *pList)
{
free(pList->head);
}
void InsFirst(LinList *pList,Node *pNewNode)
{
if(pList->length==0)
{
pList->head->next=pNewNode;
pNewNode->next=NULL;
}
else
{
pNewNode->next=pList->head->next;
pList->head->next=pNewNode;
}
(pList->length)++;
}
void ListShow(LinList List)
{
Node *p=(List.head)->next;
while(p!=NULL)
{
printf("%d\t",p->elem);
p=p->next;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
LinList MyList;
InitList(&MyList);
Node *pNewNode_1;
MakeNode(pNewNode_1,1);
//InsFirst(&MyList,NewNode_1);
//ListShow(MyList);
return 0;
}
[解决办法]
在_tmain函数中下面两句有问题
Node *pNewNode_1;
MakeNode(pNewNode_1,1);
不知道你的原意是怎样,据我猜测,你编写的MakeNode函数的目的可能是申请节点空间,并分配给一个传入的节点指针。如果是的话,那么就有问题了,因为参数是一个指针变量,你在MakeNode函数内你是对一个指针变量操作,但并不是对指针所指的变量进行操作,所以操作完后内部的指针变量是指向了刚申请的节点空间,但是调用该函数接口的指针变量确什么都没做,只是把指针变量的值(注意,这里传给函数接口参数的是指针变量值,函数对该变量直接操作而不操作该指针变量所指的值并不会影响到外部的指针变量)。可见是把指针的用法给搞混了
因此函数接口应该改为
void MakeNode(Node **pNode,ElemType e)
{
*pNode=(Node*)malloc(sizeof(Node));
*pNode- >next=NULL;
*pNode- >elem=e;
}
对应外部调用是
Node *pNewNode_1;
MakeNode(&pNewNode_1,1);
或者以引用的形式
void MakeNode(Node *& pNode,ElemType e)
{
pNode=(Node*)malloc(sizeof(Node));
pNode- >next=NULL;
pNode- >elem=e;
}
对应外部调用是
Node *pNewNode_1;
MakeNode(pNewNode_1,1);