天天看点

双向循环链表c语言,双向循环链表的实现与使用

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

首先是节点的创建:

创建的时候就要将数据填充到节点中,所以需要传入一个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;

}