C 编写和阅读链接列表

C 编写和阅读链接列表,c,pointers,linked-list,fwrite,fread,C,Pointers,Linked List,Fwrite,Fread,我(像往常一样)在写和读链接列表时有点麻烦。 它被保存到二进制文件的事实让我感到困惑。 我试图编写一个简单的程序,只有一个简单的结构和两个变量,并将其写入和读取到磁盘,只是为了检查我是否误用了fread()或fwrite()。然而,我不是。程序运行顺利。 当我开始向链表添加指针和节点时,问题就开始了。 我已经检查了stackoverflow.com、cplusplus.com、cprograming.com,从我所看到的,我的程序没有任何问题。试过调试,没什么。编译器一点也不抱怨 下面包含的源代

我(像往常一样)在写和读链接列表时有点麻烦。 它被保存到二进制文件的事实让我感到困惑。 我试图编写一个简单的程序,只有一个简单的结构和两个变量,并将其写入和读取到磁盘,只是为了检查我是否误用了
fread()
fwrite()
。然而,我不是。程序运行顺利。 当我开始向链表添加指针和节点时,问题就开始了。 我已经检查了stackoverflow.com、cplusplus.com、cprograming.com,从我所看到的,我的程序没有任何问题。试过调试,没什么。编译器一点也不抱怨

下面包含的源代码非常简单:包含一个包含两个变量的结构,名称和代码,就像一个客户端控件。代码由程序自动给出,用户输入名称。然后程序应该保存数据,并继续运行。但是,它不能通过
fir->sacode=1
赋值。 任何提示都将不胜感激

#include <stdio.h>

void save(void);
int load(void);

struct solic {
    char name[10];
    int sacode;
    struct solic *next;
};

struct solic *cur, *fir;
int sacode = 1;

int main()
{
    if(load() == 0)
        printf("Load Successful!\n");

    char cho1;
    fir->sacode = 1;
    cur=fir;
    while(1){
        cur->sacode = sacode;
        printf("Client code is %04d",cur->sacode);
        printf("Enter client name: ");
        scanf("%s",cur->name);
        save();
        printf("Saved!\n");
        printf("Press '1' to enter another client, or 'Enter' to save and exit.\n");
        scanf("%c",&cho1);
        if(cho1 == '1')
        {
            cur->next = (struct solic *)malloc(sizeof(struct solic));
            cur = cur->next;
            sacode++;
            cur->sacode = sacode;
            continue;
        }
        else if(cho1 == '\r');
            break;
    }

    return(0);
}

void save(void)
{
    FILE *pFile;
    pFile = fopen("db.dat","w");
    while(cur != NULL)
    {
        fwrite(cur->name,sizeof(cur->name),1,pFile);
        fwrite(&cur->sacode,sizeof(int),1,pFile);
        cur = cur->next;
    }
    fclose(pFile);
}

int load(void)
{
    int size;
    char buffer[10];

    FILE *pFile;
    pFile = fopen("db.dat","r");
    if(pFile == NULL)
        return(1);

    size = fseek(pFile,0,SEEK_END);
    rewind(pFile);
    cur = fir;

    while(size >= ftell(pFile))
    {
        fread(cur->name,sizeof(cur->name),1,pFile);
        fread(buffer,sizeof(int),1,pFile);
        cur->sacode = atoi(buffer);
        sacode++;
        cur->next = (struct solic *)malloc(sizeof(struct solic));
        cur = cur->next;
    }
    cur->next = NULL;
    return(0);
}
#包括
作废保存(作废);
内荷载(空隙);
结构solic{
字符名[10];
内囊;
结构solic*next;
};
结构solic*cur,*fir;
int-sacode=1;
int main()
{
如果(加载()==0)
printf(“加载成功!\n”);
char cho1;
fir->sacode=1;
cur=fir;
而(1){
cur->sacode=sacode;
printf(“客户端代码为%04d”,cur->sacode);
printf(“输入客户名称:”);
scanf(“%s”,cur->name);
save();
printf(“已保存!\n”);
printf(“按“1”进入另一个客户端,或按“enter”保存并退出。\n”);
scanf(“%c”和&cho1);
如果(cho1=='1')
{
cur->next=(struct solic*)malloc(sizeof(struct solic));
cur=cur->next;
囊状代码++;
cur->sacode=sacode;
继续;
}
else if(cho1=='\r');
打破
}
返回(0);
}
作废保存(作废)
{
文件*pFile;
pFile=fopen(“数据库数据”,“w”);
while(cur!=NULL)
{
fwrite(cur->name,sizeof(cur->name),1,pFile;
fwrite(&cur->sacode,sizeof(int),1,pFile);
cur=cur->next;
}
fclose(pFile);
}
整数负载(无效)
{
整数大小;
字符缓冲区[10];
文件*pFile;
pFile=fopen(“数据库数据”,“r”);
if(pFile==NULL)
申报表(1);
大小=fseek(pFile,0,SEEK_END);
倒带(pFile);
cur=fir;
而(大小>=ftell(pFile))
{
fread(cur->name,sizeof(cur->name),1,pFile;
fread(缓冲区,sizeof(int),1,pFile);
cur->sacode=atoi(缓冲区);
囊状代码++;
cur->next=(struct solic*)malloc(sizeof(struct solic));
cur=cur->next;
}
cur->next=NULL;
返回(0);
}
  • 第一次运行此程序时,
    load()
    将失败,因为没有数据。这意味着
    fir
    尚未初始化,因此
    fir->sacode=1
    将尝试更新内存中的一些随机位置。在
    fir
    中存储任何内容之前,需要使用
    malloc()
    为其分配一个新节点

  • save()
    函数每次运行时都会从
    cur
    指针开始写入一个新的
    db.dat
    文件。但每次调用时,
    cur
    都指向列表中的最后一个元素。您需要打开此文件进行追加,这样它就不会写入任何已经存在的数据,或者循环遍历整个列表


  • @谢谢你的回答!1.所以在理论上,这可以用
    fir=(struct solic*)malloc(sizeof(struct solic))来解决
    将节点分配给
    fir
    ,对吗?2.这可以通过将
    cur
    分配给
    fir
    ,然后在列表中循环来解决。请注意,在这里,强制转换
    malloc()
    的返回值是非常不受欢迎的,因此我建议您使用
    fir=malloc(sizeof(struct solic))
    ,如果这样做只是为了避免被争论它的人转移注意力。:-)