#include
#include
// 定义链表结构体
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
// 创建新节点
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL; return newNode;
}
// 尾插法创建链表
Node *createList(int n) {
Node *head = createNode(0); // 创建头结点
Node *tail = head; // 尾指针指向头结点
int i, data;
for (i = 0; i < n; i++) {
printf("请输入第%d个节点的值:", i + 1);
scanf("%d", &data);
Node *newNode = createNode(data);
tail->next = newNode;
newNode->prev = tail; tail = newNode;
}
return head;
}
// 删除指定元素
void deleteNode(Node *head, int data) {
Node *p = head->next;
while (p != NULL) {
if (p->data == data) {
p->prev->next = p->next;
if (p->next != NULL) {
p->next->prev = p->prev;
}
free(p);
printf("删除成功!\n");
return;
}
p = p->next;
}
printf("未找到要删除的元素!\n");
}
// 输出链表中的所有数据
void printList(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head = createList(4); // 创建长度为4的链表
printList(head); // 输出链表中的所有数据
deleteNode(head, 3); // 删除指定元素
printList(head); // 输出删除后的链表中的所有数据
return 0;
}
在这个程序中为什么会有尾指针指向头结点?