C语言怎么存链表形式的结构体文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎么存链表形式的结构体文件?相关的知识,希望对你有一定的参考价值。

struct Client

char Name[10];
int Sex;
int Age;
char IDcard[18];
int day;
int date;
int date2;
char Tel[11];
long Price;
Clientlist[2];

struct room

int RoomID;
int Sign;
struct Client Clientlist[2];
struct room*next;

Room[NUM];这是结构体的代码。
void save()

struct room*head;
FILE*fp=fopen("date.txt","wb");
struct room*p=head;
while(p!=NULL)

fwrite(p,sizeof(struct room),NUM,fp);
p=p->next;

fclose(fp);
这是文件存储代码请大佬指点哪里错了

参考技术A 看你的代码是每次写入一个节点到文件,但是fwrite(p,sizeof(struct room),NUM,fp);这句是每次写入NUM大小的一个room数组,把NUM改成1:
fwrite(p,sizeof(struct room),1,fp); //每次写入一个节点追问

NUM改成1也一样运行不了啊...

追答

哦,save函数里纯粹没有链表存在啊,你要传递链表给save,head是是传递进来的
void save(struct room*head) //传递


FILE*fp=fopen("date.txt","wb");
struct room*p=head;
while(p!=NULL)

fwrite(p,sizeof(struct room),1,fp);
p=p->next;

fclose(fp);


大体是这样的:
int main()

.........//建立链表
save(head); //传递链表给save函数

追问

怎样建立链表呢,入门学者有点不会

参考技术B struct room* p = head;
head是空指针,换成实际的头指针
fwrite(p, sizeof(struct room), NUM, fp);
p指针一次只指向一个room,改成fwrite(p, sizeof(struct room), 1, fp);
写入的是二进制文件,最好装个类似如winhex的软件,方便查看实际生成的文件是否符合需要追问

怎么换成实际的头指针?

追答

你总得先生成链表吧,没有链表哪来的头指针

追问

大佬麻烦教一下呗怎么生成链表

C语言结构体和共用体_07

  • 概述
  • 定义结构体类型变量的方法
  • 结构体变量的引用
  • 结构体变量的初始化
  • 结构体数组
  • 指向结构体类型数据的指针
  • 用指针处理链表
  • 共用体
  • 枚举类型
  • 用 typedef定义类型

 概述

定义一个结构体的一般形式:

struct 结构名 {
        成员列表
};

一个结构体有一个结构名,但不是必须的。成员列表有若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名;

例如:

    // 学号、姓名、性别、年龄、地址等属性
    struct Student {
        int num;
        char name[20];
        char sex;
        int age;
        char addr[30];
};

 

定义结构体类型变量的方法

在定义了结构体变量后,系统会位置分配内存单元。

可以采用三种方法定义结构体类型变量:

1)先声明结构体类型再定义变量名;

struct Student person1;
struct Student person2;

则,person1、person2 具有struct Student类型的结构。

2)在声明类型的同时定义变量

struct Student {
        int num;
        char name[20];
        char sex;
        int age;
        char addr[30];
} student1, student2;

3)直接定义结构体类型变量,即不出现结构体名

struct {
        int num;
        char name[20];
        char sex;
        int age;
        char addr[30];
} student1;

 

结构体可以嵌套:例如:

struct date {
        int month;
        int day;
        int year;
};
    
    struct Student {
        int num;
        char name[20];
        char sex;
        int age;
        char addr[30];
        struct date birthday; // date结构体
};

 

结构体变量的引用

在定义了结构体变量以后,若要引用这个变量,必须遵守以下规则:

1)不能将一个结构体变量作为一个整体进行输入和输出。

正确引用方法:结构体变量名.成员名 

示例:

printf("\\n%d\\n%s\\n%c\\n%d\\n%d\\n%d\\n%.2f\\n", student1.num, student1.name, student1.sex, student1.birthday.year, student1.birthday.month, student1.birthday.day, student1.score);
student1.num = 100;

"."是成员(分量)运算符,它在所有的运算符中优先级最高。因此可以把student1.num等作为一个整体来看待。上面赋值语句的作用是将整数100赋给student1变量中的成员num。

struct Student student1 = {21, "Kingdev", \'f\', {2016, 3, 28}, 90.f};
struct Student student2 = {10, "Learning", \'m\', {2010, 10, 10}, 80.f};
student1 = student2; // 整体赋值
printf("\\n%d\\n%s\\n%c\\n%d\\n%d\\n%d\\n%.2f\\n", student1.num, student1.name, student1.sex, student1.birthday.year, student1.birthday.month, student1.birthday.day, student1.score);

打印出的结果为变量 student2 的值。

2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符一级一级的找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。如:

student1.birthday.year, student1.birthday.month, student1.birthday.day

3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)

如:

// 计算两位学生的分数和
float sum = student1.score + student2.score;

4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址;

结构体地址和结构体第一个元素地址是一致的。结构体变量的地址主要用作函数的参数,传递结构体变量的地址。

    printf("student1 Address   - %p\\n", &student1);
    printf("student1 first Ele - %p\\n", &student1.num);
    // 打印结果
    student1 Address   - 0x7fff5fbff7b0
    student1 first Ele - 0x7fff5fbff7b0

 

结构体变量的初始化

 

尊重作者劳动成果,转载请注明: 【kingdev】

以上是关于C语言怎么存链表形式的结构体文件?的主要内容,如果未能解决你的问题,请参考以下文章

C语言可以在一个链表里保存两个结构体吗

C语言结构体和共用体_07

C语言结构体里的结构体怎么初始化

C 语言关于结构体做参数传递?

C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!

C语言结构体初始化问题