该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先是节点的创建:
创建的时候就要将数据填充到节点中,所以需要传入一个data参数,
还需设置两个节点的地址,一个是前节点,一个是后节点
也就是setPrev和setNext,之所以是Node*类型是因为
malloc这个函数返回的是它分配内存的地址
所以在节点创建时我们拿到的数据就是这个节点的地址数据,
地址数据当然应当用指针来保存
所以我们实际上对于每个节点的内容,以及节点与节点之间的操作都是通过指针实现的
那么我们怎么从createNode()这个函数中,获取到当前创建的新节点地址呢
有两种方案:
方案一:将节点地址作为返回值,但是有一个问题,我们要先分配一个内存,然后要往这个内存中填写数据,所以我们必然需要用到一个临时的指针变量currentNode记录这个节点的地址,然后在函数运行结束之前用return currentNode;但是这个变量是一个局部变量,其作用域很生命周期有限,并不能长久的保存malloc分配的地址数据。所以需要将createNode()这个函数声明为static,延长它的生命周期。
static Node* createNode(DataType data, Node *setPrev, Node *setNext)
{
Node *currentNode=(Node*)malloc(sizeof(Node));
currentNode->prev=setPrev;
currentNode->data=data;
currentNode->next=setNext;
return currentNode;
}
方案二:添加一个指针参数用来接收这个地址数据,
因为这个要接收的数据本身就是一个地址
所以用来接收这个数据的变量,类型必须是指针,
而这个变量又在createNode()函数外部,
要在函数中改变外部变量的内容,就要传入外部变量的地址,
所以这个接收参数currentNode实际上是一个指针的指针,
也就是我们所说的二级指针。
void createNode(DataType data, Node *setPrev, Node **currentNode, Node *setNext)
{
(*currentNode)=(Node*)malloc(sizeof(Node));
(*currentNode)->prev=setPrev;
(*currentNode)->data=data;
(*currentNode)->next=setNext;
}