• C语言中怎么将文件里的数据创建到(读到)链表中?


    定义的结构体:

    struct student
    {  
    char ID[11]; //学生学号
    char name[20];  //学生姓名
     
    struct student *next;  //next 指针 指向 struct  student 类型的变量
    }stu;
    
     

    创建文件:

    void Create_File_List()
    {
        FILE *fp;
        if ((fp = fopen("student.txt","rb"))==NULL)                 /*如果此文件不存在*/
        {
            if ((fp = fopen("student.txt","wb+"))==NULL)
            {
                outtextxy(220, 200, "无法建立文件!");  
                
            }
        }
    }


     

    写入文件信息:

    /***************
    
    函数功能:录入出勤学生
    
    
    /***************/
    
    
    void add_student(  )
    {
        FILE *fp;
        fp=fopen("student.txt","a+"); 
        strcpy(stu.ID,"");// 与链表head结点 无数据 有关
        strcpy(stu.name,"");
        fwrite(&stu,sizeof(struct student),1,fp);
        InputBox(stu.ID,11,"请输入学生学号");
        outtextxy(380,200,stu.ID);    
        Sleep(500);
        InputBox(stu.name,20,"请输入学生姓名");
        outtextxy(380,250,stu.name);
        Sleep(500);
        fwrite(&stu,sizeof(struct student),1,fp);
        fclose(fp);
      }

    这里值得注意的是:写入文件的时候,开始时要事先写入第一个数据,这里写入的空数据,这与链表head处数据为空有关。

    从已经写入的文件中读到链表中:

    /***************
    
    函数功能:创建链表
    
    /***************/
    struct student * CreateList() 
    {  
        struct student *pointer,*head,*q;//head指针为链表的头结点,是找到链表的唯一依据,如果head指针丢失,那么整个链表就找不到了;p指针总是指向新申请的结点;q指针总是指向尾节点
        struct student temp;//定义结构体别名
        FILE *fp;
        pointer=(struct student *)malloc(sizeof(struct student ));  // p指向新开辟的节点内存
        head = pointer;    //开辟头结点内存      头结点中没有学生成绩信息
        q = pointer;       //开辟尾节点内存   q指针总是指向尾节点
        q->next = NULL; // //标志链表的结束 尾节点的特点是next成员的值为NULL,它是最后一个节点,作为链表结束的标志,NULL是一个符号常量表示值为0的地址
        fp=fopen("student.txt","rb");
        while(fread(&temp,sizeof(struct student),1,fp)!=0)//从文件中读结构体块
        {      pointer=(struct student*)malloc(sizeof(struct student)); // p指向新开辟的节点内存
        strcpy(pointer->ID,temp.ID);
        strcpy(pointer->name,temp.name);
        q->next=pointer;  //把新节点挂到原尾节点之后
        q=q->next;  //q指针指向新的尾节点
        }
        q->next=NULL;//标志链表的结束 
        fclose(fp);
        return head;
    }

    从链表中输出打印到屏幕中数据:

    /***************
    
    函数功能:
    输出链表 
    返回:指向链表表头的指针 /**************
    */ void Print_List(struct student *head) { struct student* pointer; pointer=head->next; //跳过无数据的头结点 while(pointer!=NULL) { outtextxy(x,y,pointer->ID); outtextxy(x,y,pointer->name); pointer=pointer->next;//指向下一个节点 }
    }
  • 相关阅读:
    【IOS】判断字符串为空和只为空格解决办法
    【IOS】UIActionSheet的使用
    【IOS】倒计时实现的两种方法
    android 给listview或gridview添加数据加载时的动画
    彻底颠覆你的思维,羊毛出在狗身上,猪来买单
    王石:活着的意义在哪?
    android 将图片通过base64转换为String 将图片String转换为Bitmap
    Android 之 下拉框(Spinner)的使用
    ViewPager的简单使用说明
    Android的onCreateOptionsMenu()创建菜单Menu详解
  • 原文地址:https://www.cnblogs.com/zhaocundang/p/4780260.html
Copyright © 2020-2023  润新知