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

设计算法求带头结点的循环单链表中的结点个数(不计头结点)。c语言设计

发布于 2024-10-29 21:17:32

在C语言中,设计一个算法来计算带头结点的循环单链表中的结点个数(不计头结点)可以通过遍历链表直到回到头结点的位置。下面是一个简单的算法实现:

首先定义循环单链表的节点结构体和创建循环单链表的函数:

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

// 定义循环单链表的节点结构体
typedef struct Node {
    int data;          // 存储数据
    struct Node *next; // 指向下一个节点的指针
} Node, *LinkList;

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

    LinkList head = (Node *)malloc(sizeof(Node));
    head->next = head; // 头结点的next指向自己,形成循环
    Node *tail = head; // tail始终指向最后一个节点

    for(int i = 0; i < n; i++) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = arr[i];
        newNode->next = head->next; // 新节点的next指向第一个节点
        tail->next = newNode; // 上一个节点的next指向新节点
        tail = newNode; // tail更新为新节点
    }

    return head;
}

接下来是计算结点个数的算法:

// 计算带头结点的循环单链表中的结点个数(不计头结点)
int countNodes(LinkList head) {
    if (head == NULL || head->next == NULL) return 0; // 如果链表为空或只有一个头结点,则返回0

    Node *current = head->next; // 从第一个实际节点开始
    int count = 0;
    do {
        count++; // 累加结点数
        current = current->next; // 移动到下一个节点
    } while (current != head->next); // 当再次回到第一个实际节点时停止

    return count;
}

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

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

    // 创建循环单链表
    LinkList list = createCircularList(arr, n);

    // 输出结点个数
    printf("循环单链表中的结点个数(不计头结点): %d\n", countNodes(list));

    // 释放内存
    Node *current = list->next;
    while(current != list->next) {
        Node *temp = current;
        current = current->next;
        free(temp);
    }
    free(list); // 最后释放头结点

    return 0;
}

这段代码展示了如何创建带头结点的循环单链表、计算结点个数,并在最后释放分配的内存。请注意,这个示例中没有处理内存释放问题,在实际应用中,你需要确保正确地释放所有分配的内存以避免内存泄漏。

0 条评论

发布
问题

在线
客服