C语言双向循环链表实现:添加、删除、遍历、搜索和排序
#include <stdio.h>\n#include <stdlib.h>\n\ntypedef struct Node {\n int data;\n struct Node* prev;\n struct Node* next;\n} Node;\n\nNode* createNode(int data) {\n Node* newNode = (Node*)malloc(sizeof(Node));\n newNode->data = data;\n newNode->prev = NULL;\n newNode->next = NULL;\n return newNode;\n}\n\nvoid addNode(Node** head, int data) {\n Node* newNode = createNode(data);\n if (*head == NULL) {\n *head = newNode;\n (*head)->next = *head;\n (*head)->prev = head;\n } else {\n Node last = (*head)->prev;\n newNode->next = head;\n newNode->prev = last;\n (head)->prev = newNode;\n last->next = newNode;\n }\n}\n\nvoid deleteNode(Node head, int data) {\n if (head == NULL) {\n printf("List is empty.\n");\n return;\n }\n\n Node current = head;\n Node prevNode = NULL;\n\n while (current->data != data) {\n if (current->next == *head) {\n printf("Element %d not found in the list.\n", data);\n return;\n }\n prevNode = current;\n current = current->next;\n }\n\n if (current->next == *head && prevNode == NULL) {\n *head = NULL;\n free(current);\n return;\n }\n\n if (current == *head) {\n prevNode = (head)->prev;\n head = (head)->next;\n prevNode->next = head;\n (head)->prev = prevNode;\n free(current);\n } else if (current->next == head) {\n prevNode->next = head;\n (head)->prev = prevNode;\n free(current);\n } else {\n Node temp = current->next;\n prevNode->next = temp;\n temp->prev = prevNode;\n free(current);\n }\n}\n\nvoid traverse(Node head) {\n if (head == NULL) {\n printf("List is empty.\n");\n return;\n }\n\n Node current = head;\n do {\n printf("%d ", current->data);\n current = current->next;\n } while (current != head);\n printf("\n");\n}\n\nNode search(Node head, int data) {\n if (head == NULL) {\n printf("List is empty.\n");\n return NULL;\n }\n\n Node current = head;\n do {\n if (current->data == data) {\n return current;\n }\n current = current->next;\n } while (current != head);\n\n printf("Element %d not found in the list.\n", data);\n return NULL;\n}\n\nvoid sort(Node head) {\n if (head == NULL) {\n printf("List is empty.\n");\n return;\n }\n\n Node current = head;\n Node index = NULL;\n int temp;\n\n do {\n index = current->next;\n while (index != *head) {\n if (current->data > index->data) {\n temp = current->data;\n current->data = index->data;\n index->data = temp;\n }\n index = index->next;\n }\n current = current->next;\n } while (current->next != *head);\n}\n解释每行程序\n\n这是一个双向循环链表的实现。\n\n1. #include <stdio.h>和#include <stdlib.h>是C语言的标准库头文件,分别包含了输入输出函数和动态内存分配函数。\n2. typedef struct Node定义了一个名为Node的结构体类型,包含了一个整型数据data,以及两个指向Node类型的指针prev和next。\n3. Node* createNode(int data)是一个函数,用于创建一个新的节点,并返回指向该节点的指针。该函数首先使用malloc函数动态分配了一个Node类型的内存块,然后将data初始化为传入的参数值,prev和next初始化为NULL,最后返回指向新节点的指针。\n4. void addNode(Node** head, int data)是一个函数,用于向链表中添加一个节点。该函数首先调用createNode函数创建一个新节点,然后根据链表是否为空来确定新节点的位置。如果链表为空,则将新节点设为头节点,并使其prev和next都指向自身;否则,将新节点插入到链表的最后一个节点之后,并更新相关的指针。\n5. void deleteNode(Node** head, int data)是一个函数,用于删除链表中的一个节点。该函数首先检查链表是否为空,如果为空则打印错误信息并返回。然后使用两个指针current和prevNode来遍历链表,找到要删除的节点。删除操作分为三种情况:如果要删除的节点是唯一的节点,则将头指针设为NULL并释放内存;如果要删除的节点是头节点,则更新头指针和最后一个节点的指针,并释放内存;如果要删除的节点是中间节点,则更新前后节点的指针,并释放内存。\n6. void traverse(Node* head)是一个函数,用于遍历并打印链表中的所有节点。该函数首先检查链表是否为空,如果为空则打印错误信息并返回。然后使用一个指针current来遍历链表,打印每个节点的数据,并将指针移动到下一个节点,直到回到头节点为止。\n7. Node* search(Node* head, int data)是一个函数,用于在链表中查找指定的数据。该函数首先检查链表是否为空,如果为空则打印错误信息并返回NULL。然后使用一个指针current来遍历链表,如果找到与指定数据相等的节点,则返回该节点的指针;如果遍历完整个链表仍未找到,则打印错误信息并返回NULL。\n8. void sort(Node** head)是一个函数,用于对链表中的节点进行排序。该函数首先检查链表是否为空,如果为空则打印错误信息并返回。然后使用两个指针current和index来遍历链表,并比较相邻节点的数据大小,如果前一个节点的数据大于后一个节点的数据,则交换它们的数据。通过多次遍历和比较,将数据按照升序进行排序。
原文地址: https://www.cveoy.top/t/topic/pO6l 著作权归作者所有。请勿转载和采集!