2402_88007130 2024-10-11 21:51 采纳率: 50%
浏览 3
已结题

数据结构 c语言 单链表的创建

img

img


为什么没出错 但是并没有显示我想要的单链表形式呢 好难理解啊 但是我在啊哈c上面能运行出来数据,但是显示的也不是我想要的 我想知道我的代码到底这么回事 纯手敲的 第一次接触数据结构 在慢慢学习中

  • 写回答

2条回答

  • 香格里辣 2024-10-11 22:02
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在C语言中,单链表是一种常见的线性数据结构,用于存储元素,并允许对它们进行添加、删除操作以及获取特定元素的信息。

    数据结构概述

    单链表由一系列节点组成,每个节点包含一个指向下一个节点的指针(称为next)。单链表的基本操作包括:

    1. 创建新节点:通过分配内存空间并初始化指针值来创建一个新的节点。
    2. 插入到链表尾部:将新的节点插入到链表的末尾,以便保持节点之间的关系。
    3. 删除节点:从链表中移除指定位置的节点。
    4. 查找节点:根据某个条件找到链表中的特定节点。
    5. 遍历链表:逐个访问链表中的所有节点。

    创建单链表

    要创建一个空的单链表,可以使用以下代码片段:

    #include <stdio.h>
    
    #define MAX_SIZE 100 // 定义最大节点数量
    
    typedef struct Node {
        char *name;       // 节点名称
        char *start;      // 节点开始时间
        char *end;        // 节点结束时间
        char *date;       // 节点日期
        int price;        // 节点票价
    } Ticket;
    
    struct Node *head = NULL; // 初始化头结点为空
    
    void initList(struct Node **head) {
        /* 初始化头结点 */
        head = malloc(sizeof(struct Node)); // 分配内存空间
    }
    
    

    插入数据

    接下来,我们实现插入数据的功能:

    void insertData(struct Node **head, char *name, char *start, char *end, char *date, int price) {
        Ticket *newTicket = malloc(sizeof(Ticket)); // 分配内存空间
        if (newTicket != NULL) {
            strcpy(newTicket->name, name); // 设置节点名称
            strcpy(newTicket->start, start); // 设置节点开始时间
            strcpy(newTicket->end, end); // 设置节点结束时间
            strcpy(newTicket->date, date); // 设置节点日期
            newTicket->price = price; // 设置节点票价
    
            Ticket *temp = *head; // 指向当前头结点
            while (temp->next != NULL) { // 找到最后一个节点
                temp = temp->next;
            }
            temp->next = newTicket; // 将新节点插入到最后
        }
    }
    

    删除节点

    为了删除节点,我们可以简单地更新它的前驱节点的next指针:

    void deleteNode(struct Node **head, char *name) {
        Ticket *current = *head;
        Ticket *prev = NULL;
    
        while (current != NULL && strcmp(current->name, name)) {
            prev = current;
            current = current->next;
        }
    
        if (current == NULL) return; // 如果没有找到目标节点
    
        if (prev == NULL) {
            *head = current->next; // 删除头结点
        } else {
            prev->next = current->next; // 更新前驱节点的next指针
        }
    
        free(current); // 移动指针释放内存
    }
    

    遍历链表

    对于遍历链表,我们需要遍历整个链表以确保安全地访问所有的节点:

    void traverseList(struct Node *head) {
        Ticket *current = head;
        printf("车次名:%s\n出发地:%s\n目的地:%s\n时间:%s\n价格:%d\n", current->name, current->start, current->end, current->date, current->price);
        current = current->next;
        while (current != NULL) {
            printf("\n\t%-10s\t%-10s\t%-10s\t%-10s\t%d\n", current->name, current->start, current->end, current->date, current->price);
            current = current->next;
        }
    }
    

    主函数

    最后,我们将这些功能组合在一起,形成主函数main

    int main() {
        struct Node *head = NULL;
        initList(&head);
    
        insertData(&head, "k214", "Xinxiang", "Beijing", "2024-10-1", 200);
        insertData(&head, "k322", "Tianjin", "Nanjing", "2024-9-30", 300);
        insertData(&head, "k431", "Shanghai", "Hangzhou", "2024-11-1", 150);
    
        traverseList(head);
    
        deleteNode(&head, "k114");
    
        traverseList(head);
    
        return 0;
    }
    

    以上就是如何使用C语言创建和操作单链表的一个基本示例。注意,这个例子非常基础,实际应用中可能需要处理更多的复杂情况,如错误处理、性能优化等。

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

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月11日

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错