免檒 2023-12-04 19:35 采纳率: 87.5%
浏览 3
已结题

关于创建链表的方法(尾插法)

#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;
}

在这个程序中为什么会有尾指针指向头结点?

  • 写回答

3条回答 默认 最新

  • 一个蒜头 2023-12-04 21:31
    关注

    这个代码中创建的链表为环形链表,是链表的其中一种形式
    环形链表是一种特殊的链表数据结构,其中链表中的最后一个节点指向链表中的某个先前节点,形成一个环。环形链表可以在许多情况下使用,例如:

    循环遍历:当需要循环遍历链表中的元素时,可以使用环形链表来简化实现。遍历可以从任意节点开始,并在回到起始节点之前继续进行。

    环形缓冲区:环形链表可以用作环形缓冲区的数据结构。在实时系统或需要循环缓冲区的应用中,环形链表可以高效地插入和删除元素。

    解决问题:在某些问题的解决方案中,环形链表可以提供一种简洁而高效的数据结构表示。例如,约瑟夫问题(Josephus problem)和判断链表是否存在环(Linked List Cycle)等问题可以使用环形链表来实现。

    轮询算法:环形链表可以用于实现轮询算法,例如任务调度算法中的循环轮询分配任务。

    总之,当需要循环遍历、环形缓冲区或解决特定问题时,可以考虑使用环形链表。它提供了一种便捷的数据结构来管理循环相关的逻辑和操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗