‘壹’ 链表写入文件与读出 c语言
structstu
{longnum;
charname[10];
intscore;
structstu源轿*next;
};
#defineSIZE(&(((structstu*)NULL)->next))
intsave(structstu*l,char*file)
{
FILE*fp;
fp=fopen(file,"wb");
if(fp==NULL)return0;
while(l)
{
fwrite(l,SIZE,1,fp);
}
fclose(fp);
return0;
}
structstu*load(char*file)
{
FILE*fp;
structstu*h=NULL,*p,*t;
fp=fopen(file,"wb");
if(fp==NULL)returnNULL;
while(l)
{
t=(structstu*)malloc(sizeof(structstu));
fread(t,SIZE,1,fp);
t->next=NULL;
if(feof(fp))
{
free(t);
break;
}
if(h==NULL)h=p=t;
else
{
雹铅肆p->next=t;
激坦p=t;
}
}
fclose(fp);
returnh;
}
以上是不带头结点链表的读写。
带头结点的, 只需要稍做改动即可。
‘贰’ 链表文件读取与写入的C语言程序代码怎么写啊
一雹陵模边读取链表里面的内容,一边使用write函数写进文件;
一边用源缓read函数读取文件信息,一边保存在链表中。
链表保存信息,必须要结构体,因为要有地址保存下个链表的地址
struct test
{
char arry[100];//用于保存信息
struct test * next;//用于保存下个内容信息的指针地址
};
这样就可以把信息链接在一起了汪冲。
‘叁’ C语言链表的读取
把你的主函数和操作步骤贴出来呗
‘肆’ C语言 如何将文件里数据读入链表中,在下次用时自动导入数据
给你优化了一下,你试试,有问题再联系
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Stu)
struct Stu *inlist();
void save(struct Stu *head);
struct Stu *add(struct Stu *head);
void insertNode(struct Stu *head,struct Stu *newNode);
struct Stu *read();
void print(struct Stu *head);
typedef struct Stu{
char name[20];
char sex[10];
char dep[20];
int number;
struct Stu *next;
}sqlist;
sqlist *inlist()/*数据的输入*/
{
sqlist *p,*q;
sqlist *head;
int n=0;
printf("请输入名字 性别 部门 学号:\n");
p=q=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
head=NULL;
while(p->number!=0)
{n=n+1;
if(n==1)
head=p;
else
q->next=p;
q=p;
p=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
}
q->next=NULL;
return head;
}
void save(sqlist *head)
{
sqlist *p;
FILE *f;
p=head;
if(p!=NULL)
{
f=fopen("amd.txt","w+");
do
{
/*
char name[20];
char sex[10];
char dep[20];
int number;
fprintf(f,"%5s%5s%5s%5d\n",&p->name,&p->sex,&p->dep,&p->number);
printf("%5s%5s%5s%5d\n",p->name,p->sex,p->dep,p->number);
数据如果超过5的长度,读的时候就不能正确取出来了,因此,应该按数据定义的长度来记录数据
+1是为了读取时方便,左对齐右补空格
**/
fprintf(f,"%-21.21s%-11.11s%-21.21s%-11d\n",p->name,p->sex,p->dep,p->number);
p=p->next;
}
while(p!=NULL);
fclose(f); //fclose要和fopen相呼应
}
//close(f);
}
sqlist *add(sqlist *head)
{
sqlist *p,*New;
//sqlist *q;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
printf("请输入名字 性别 部门 学号:\n");
New=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",New->name,New->sex,New->dep,&New->number);
New->next=p->next;
p->next=New;
if(New->next==NULL)
{
return head;
}
else
printf("wait");
return head;
}
sqlist *read()
{
FILE *fp;
sqlist *f,*head=NULL; //指针要习惯给它赋初值NULL,不要形成野指针
char str[128];
if((fp=fopen("amd.txt","r+"))==NULL)
{
printf("打开文件失败!!\n");
return head; //此时head is NULL
}
if( fgets( str , sizeof(str) , fp ) == NULL )
{
printf("文件中没有数据!\n");
fclose(fp);
return head; //此时head is NULL
}
//有数据再创建链表,不要创建空表
head=(sqlist*)malloc(LEN);
if(head==NULL)
{
printf("分配内存失败!\n");
fclose(fp);
exit(0);
}
head->next=NULL;
sscanf(str,"%s %s %s %d",head->name,head->sex,head->dep,&head->number) ;
while (fgets( str , sizeof(str) , fp ) != NULL)
{
f=(sqlist*)malloc(LEN);
f->next=NULL;
sscanf(str,"%s %s %s %d",f->name,f->sex,f->dep,&f->number) ;
insertNode(head,f);
}
fclose(fp);
return head;
}
void insertNode(sqlist *head,sqlist *newNode)
{
sqlist *f;
f=head;
while(f->next!=NULL)
{
f=f->next;
}
f->next=newNode;
newNode->next=NULL;
}
void print(sqlist *head)
{
sqlist *f;
f=head;
if(f!=NULL)
{
do
{
printf("%-21s%-11s%-21s%-11d\n",f->name,f->sex,f->dep,f->number);
f=f->next;
}while(f!=NULL);
}
}
int main()
{
sqlist *head;
head=read();
if ( head == NULL )
{
head=inlist();
save(head);
}
else
print(head);
head=add(head);
save(head);
print(head);
return 0;
}
‘伍’ C语言中链表的存储、读取、修改问题
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
‘陆’ C语言单向链表中如何往文件里存入数据和读取数据
只需要将文件标示为二进制即可。
struct student stu[256];
//将stu赋值...
FILE * fd=fopen("c:\\test.bin","wb");//打开
int i;
for(i=0;i<256;i++)//写入
fwrite((void*)&stu[i],sizeof(struct student),1,fd);
//读取第k个结构体
struct student rstu;
FILE *fd=fopen("c:\\test.bin","rb");//打开
fseek(fd,k*sizeof(struct student),SEEK_SET);//定位
fread(&rstu,sizeof(struct student),1,fd);//读取