📅  最后修改于: 2023-12-03 15:26:09.772000             🧑  作者: Mango
双向链表是一种常见的线性数据结构,它由多个节点组成,每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。双向链表可以用于实现栈、队列、哈希表等数据结构。
创建一个双向链表需要先定义节点的结构,一个节点的结构应该包括两个指针(指向前一个节点和后一个节点)和一个数据域,数据域用于存储节点的数据。
struct Node {
int data;
struct Node* prev; // 指向前一个节点
struct Node* next; // 指向后一个节点
};
接着,我们可以写一个函数来创建n个节点的双向链表。该函数将返回链表的头指针。
struct Node* createLinkedList(int n) {
// 定义头节点和尾节点
struct Node *head, *tail, *new_node;
head = NULL;
tail = NULL;
// 循环创建n个节点
for (int i = 0; i < n; i++) {
// 动态申请节点
new_node = (struct Node*) malloc(sizeof(struct Node));
printf("Enter the data of node %d: ", i+1);
scanf("%d", &new_node->data);
// 处理指针
new_node->prev = tail;
new_node->next = NULL;
if (head == NULL) {
// 如果链表为空,设置头指针为新节点,尾指针也为新节点
head = new_node;
tail = new_node;
} else {
// 如果链表不为空,将新节点连接到尾节点
tail->next = new_node;
tail = new_node;
}
}
return head;
}
该函数实现了动态创建n个节点的双向链表。
计算双向链表的节点数可以用一个循环来实现,直到节点的指针为NULL。
int countNodes(struct Node* head) {
int count = 0;
struct Node* curr = head;
while (curr != NULL) {
count++;
curr = curr->next;
}
return count;
}
该函数会遍历整个链表,直到尾节点,每经过一个节点,计数器加1,最后返回计数器值。
本文介绍了如何创建一个n个节点的双向链表并计算节点数,涉及了链表结构、动态内存申请和计算节点数的基础知识点。希望读者通过本文的学习能够深入理解双向链表的结构和实现原理。