• 智能AI问答!更聪明、更完整、原创作!
  • 一款基于GPT的超级AI机器人,可以回答问题、聊天、创作、写文案!

用c语言设计算法判断带头结点的双向循环链表是否对称。

发布于 2024-10-29 21:19:25

在C语言中,设计一个算法来判断带头结点的双向循环链表是否对称,需要遍历链表并比较对应位置的节点。以下是一个简单的算法实现:

首先定义双向循环链表的节点结构体:

#include <stdio.h>
#include <stdlib.h>

// 定义双向循环链表的节点结构体
typedef struct Node {
    int data;                       // 存储数据
    struct Node *prior, *next;       // 指向前驱和后继节点的指针
} Node, *DoublyCircularList;

// 创建带头结点的双向循环链表
DoublyCircularList createDoublyCircularList(int arr[], int n) {
    if (n <= 0) return NULL;

    DoublyCircularList head = (Node *)malloc(sizeof(Node));
    if (head == NULL) {
        return NULL;
    }
    head->data = 0; // 头结点不存放有效数据
    head->prior = head->next = head; // 初始化为循环

    Node *tail = head; // tail始终指向最后一个节点
    for (int i = 0; i < n; i++) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        if (newNode == NULL) {
            // 内存不足时的处理
            return NULL;
        }
        newNode->data = arr[i];
        newNode->next = head->next; // 新节点的next指向第一个节点
        newNode->prior = head; // 新节点的prior指向头结点
        tail->next = newNode; // 上一个节点的next指向新节点
        head->prior = newNode; // 头结点的prior指向新节点
        tail = newNode; // tail更新为新节点
    }

    return head;
}

接下来是判断链表是否对称的算法:

// 判断带头结点的双向循环链表是否对称
int isSymmetric(DoublyCircularList head) {
    if (head == NULL || head->next == head) return 1; // 空链表或只有一个头结点时,认为是对称的

    Node *left = head->next; // 左侧起始节点
    Node *right = head->prior; // 右侧起始节点

    while (left != head) { // 当左侧指针未回到头结点时
        if (left->data != right->data) {
            return 0; // 如果对应节点数据不相等,则不对称
        }
        left = left->next; // 移动左侧指针
        right = right->prior; // 移动右侧指针
    }

    return 1; // 所有对应节点数据都相等,则对称
}

最后,加上主函数进行测试:

int main() {
    int arr1[] = {1, 2, 3, 2, 1}; // 示例数组,对称
    int arr2[] = {1, 2, 3, 4, 5}; // 示例数组,不对称
    int n = sizeof(arr1) / sizeof(arr1[0]);

    // 创建双向循环链表
    DoublyCircularList list1 = createDoublyCircularList(arr1, n);
    DoublyCircularList list2 = createDoublyCircularList(arr2, n);

    // 输出是否对称的结果
    printf("双向循环链表1是否对称: %d\n", isSymmetric(list1));
    printf("双向循环链表2是否对称: %d\n", isSymmetric(list2));

    // 释放内存
    // 注意:这里省略了释放内存的代码,实际应用中需要释放所有已分配的内存
    return 0;
}

这段代码展示了如何创建带头结点的双向循环链表、判断链表是否对称,并在最后输出结果。请注意,在实际应用中,你需要确保正确地释放所有分配的内存以避免内存泄漏。

0 条评论

发布
问题

在线
客服