C语言实现的双向链表所有基本操作,包括创建、插入、删除、查找、遍历、反转等算法。代码包含详细的注释,方便理解和验证
代码说明
Node 结构:定义了双向链表的节点结构,包括数据部分和前后指针。
基本操作函数:
createNode:创建新节点。
appendNode:在链表末尾追加节点。
insertAtPosition:在指定位置插入节点。
deleteNode:删除具有指定值的节点。
reverseList:反转链表。
searchNode:查找节点。
printList:打印整个链表。
freeList:释放链表占用的内存。
用户交互:主函数通过循环菜单,支持用户进行各种操作。
测试方法
编译并运行代码后,可以按照提示输入相应的操作进行验证,例如追加节点、插入节点到指定位置、删除节点、查找节点、打印链表等操作。
// 释放链表内存
void freeList(Node** head) {
Node* temp;
while (*head != NULL) {
temp = *head;
*head = (*head)->next;
free(temp);
}
}
// 主函数,供用户进行验证
int main() {
Node* head = NULL;
int choice, value, position;
while (1) {
printf("\n双向链表操作菜单:\n");
printf("1. 追加节点\n");
printf("2. 插入节点到指定位置\n");
printf("3. 删除节点\n");
printf("4. 反转链表\n");
printf("5. 查找节点\n");
printf("6. 打印链表\n");
printf("7. 退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要追加的值:");
scanf("%d", &value);
appendNode(&head, value);
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 2:
printf("请输入要插入的值:");
scanf("%d", &value);
int length = getListLength(head); // 获取链表当前长度
printf("请输入要插入的位置(从 0 开始,0 表示插入到链表头部):\n");
printf("链表当前长度为 %d,允许插入范围为 0 到 %d。\n", length, length);
scanf("%d", &position);
insertAtPosition(&head, value, position);
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 3:
printf("请输入要删除的值:");
scanf("%d", &value);
deleteNode(&head, value);
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 4:
reverseList(&head);
printf("链表已反转。\n");
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 5:
printf("请输入要查找的值:");
scanf("%d", &value);
Node* foundNode = searchNode(head, value);
if (foundNode != NULL) {
printf("节点 %d 已找到。\n", foundNode->data);
} else {
printf("节点未找到。\n");
}
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 6:
printf("当前链表:");
printList(head); // 立即展示链表
break;
case 7:
freeList(&head);
printf("程序结束。\n");
return 0;
default:
printf("无效的选择,请重试。\n");
break;
}
}
}