首页 > 其他分享 >双向链表读写文件

双向链表读写文件

时间:2024-08-18 23:38:23浏览次数:7  
标签:Node current head struct 读写 printf 链表 双向 NULL

双向链表读写文件

#include <stdio.h>
#include <stdlib.h>
struct Node
{
    char data;
    struct Node *prev;
    struct Node *next;
};

struct Node *readFile(const char *filename)
{
    FILE *file = fopen(filename, "r");
    if (file == NULL)
    {
        printf("无法打开文件\n");
        return NULL;
    }

    struct Node *head = NULL;
    struct Node *tail = NULL;
    char ch;
    while ((ch = fgetc(file)) != EOF)
    {
        struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->data = ch;
        newNode->prev = tail;
        newNode->next = NULL;
        if (tail != NULL)
        {
            tail->next = newNode;
        }
        tail = newNode;
        if (head == NULL)
        {
            head = newNode;
        }
    }

    fclose(file);
    return head;
}

void printList(struct Node *head)
{
    struct Node *current = head;
    while (current != NULL)
    {
        printf("%c", current->data);
        current = current->next;
    }
}

void writeFile(const char *filename, struct Node *head)
{
    FILE *file = fopen(filename, "w");
    if (file == NULL)
    {
        printf("无法打开文件\n");
        return;
    }

    struct Node *current = head;
    while (current != NULL)
    {
        fputc(current->data, file);
        current = current->next;
    }

    fclose(file);
}

int main()
{
    char choice;
    char filename[100];
    struct Node *head = NULL;

    while (1)
    {
        printf("\n菜单:\n");
        printf("1. 打印文件内容\n");
        printf("2. 写入文件\n");
        printf("q. 退出\n");
        printf("请选择操作:");
        scanf(" %c", &choice);

        switch (choice)
        {
        case '1':
            printf("请输入文件名:");
            scanf("%s", filename);
            head = readFile(filename);
            if (head != NULL)
            {
                printList(head);
            }
            break;
        case '2':
            printf("请输入文件名:");
            scanf("%s", filename);
            if (head != NULL)
            {
                writeFile(filename, head);
                printf("文件已写入\n");
            }
            else
            {
                printf("请先读取文件内容\n");
            }
            break;
        case 'q':
            printf("退出\n");
            if (head != NULL)
            {
                struct Node *current = head;
                while (current != NULL)
                {
                    struct Node *temp = current;
                    current = current->next;
                    free(temp);
                }
            }
            exit(0);
        default:
            printf("无效选择\n");
        }
    }
    return 0;
}

标签:Node,current,head,struct,读写,printf,链表,双向,NULL
From: https://www.cnblogs.com/yesiming/p/18366397

相关文章

  • 叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回
    叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测目录叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现SS......
  • 【面试题 02.07. 链表相交 简单】
    题目:同:160.链表相交给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例1......
  • 【142. 环形链表 II 中等】
    题目:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • go的读写锁sync.RWMutex
    有这样一个经典的读写锁问题,假设读锁和写锁之前互斥,读锁和读锁之间不互斥。现在做一个实验:1、线程A加一个读锁,然后不释放;2、然后线程B想加一个写锁,会被线程A的读锁阻塞;3、然后有个线程C尝试去加一个读锁。按照上面的步骤,步骤3能加锁成功吗?使用go语言的sync.RWMutex模拟这段......
  • [LeetCode] 1367. Linked List in Binary Tree 二叉树中的链表
    Givenabinarytree root anda linkedlistwith head asthefirstnode.ReturnTrueifalltheelementsinthelinkedliststartingfromthe head correspondtosome downwardpath connectedinthebinarytree otherwisereturnFalse.Inthiscontext......
  • 单链表
    //单链表#include<iostream>usingnamespacestd;constintN=1010;inthead,e[N],ne[N],idx;//初始化voidinit(){ head=-1; idx=0;}//插入voidadd_to_head(intx){ e[idx]=x; ne[idx]=head; head=idx; idx++;}//将x插到下标为k的点的后面voidadd(......
  • leetcode 21.合并两个有序链表
    leetcode21.合并两个有序链表题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。迭代法:思路:不断迭代,谁小指向谁publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){if(list1==null){......
  • 【数据结构】详细剖析链表,带你实现单链表,双向链表,附链表编程练习题
    目录一.链表1.链表的概念及结构2.单链表的实现2.1单链表节点结构2.2动态申请一个节点2.3单链表打印2.4单链表尾插2.5单链表头插2.6单链表尾删2.7单链表头删2.8单链表查找 2.9单链表在pos后一位插入x2.10单链表删除pos后一位的值2.11单链表销毁 ......
  • 知识改变命运 数据结构【链表面试题】
    1.删除链表中等于给定值val的所有节点。OJ链接publicListNoderemoveElements(ListNodehead,intval){if(head==null){returnnull;}ListNodecur=head.next;ListNodepre=head;while(cur!=null){......
  • PyTorch--双向长短期记忆网络(BiRNN)在MNIST数据集上的实现与分析
    文章目录前言完整代码代码解析1.导入库2.设备配置3.超参数设置4.数据集加载5.数据加载器6.定义BiRNN模型7.实例化模型并移动到设备8.损失函数和优化器9.训练模型10.测试模型11.保存模型常用函数前言本代码实现了一个基于PyTorch的双向长短期记忆网络(BiRNN),用于对MNI......