从文件中读取链表

从文件中读取链表,第1张

可以读取,用"r"模式打开文件 ,在读取时用fscanf,例如: struct a b fscanf(fp,"%d %s %c\n",&b.num,b.name,&b.sex)/*格式控制符中的\n是因为文本文件中的记录是以回车符结尾的.*/

struct Bookinfo\x0d\x0a{\x0d\x0achar num[20]//书号\x0d\x0a char name[10] //书名\x0d\x0a int jinjia //进价\x0d\x0a int shoujia //售价\x0d\x0a int shuliang//库存数量\x0d\x0a int shouchu //售出\x0d\x0a}\x0d\x0atypedef struct Node_book* pNode_book\x0d\x0astruct Node_book\x0d\x0a{\x0d\x0astruct Bookinfo bookinfo\x0d\x0apNode_book next\x0d\x0a}\x0d\x0a只存节点的数据域,以二进制文件存放:\x0d\x0aint save(struct pNode_book head)\x0d\x0a{\x0d\x0aif(!head) return 0\x0d\x0aFILE *fp=fopen("info.data","wb")\x0d\x0aint i=0\x0d\x0awhile(head)\x0d\x0a{\x0d\x0afwrite(&head->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0ahead=head->next\x0d\x0a}\x0d\x0afclose(fp)\x0d\x0a\x0d\x0areturn i\x0d\x0a} \x0d\x0a\x0d\x0aint readFromFile(struct pNode_book *head)\x0d\x0a{\x0d\x0aFILE *fp=fopen("info.data","rb")\x0d\x0aif(!fp)\x0d\x0a{\x0d\x0aprintf("Can not open the file!\n")\x0d\x0areturn 0\x0d\x0a}\x0d\x0a\x0d\x0astruct pNode_book pCur=NULL\x0d\x0afseek(fp,0,SEEK_END)\x0d\x0along end=ftell(fp)\x0d\x0afseek(fp,0,SEEK_SET)\x0d\x0aint i=0\x0d\x0aif(ftell(fp)!=end)\x0d\x0a{\x0d\x0apNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book))\x0d\x0atmpNode->next=NULL\x0d\x0a\x0d\x0afread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0a\x0d\x0a*head=tmpNode\x0d\x0apCur=*head\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("No record!\n")\x0d\x0areturn 0\x0d\x0a}\x0d\x0a\x0d\x0awhile(ftell(fp)!=end)\x0d\x0a{\x0d\x0apNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book))\x0d\x0atmpNode->next=NULL\x0d\x0a\x0d\x0afread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0a\x0d\x0apCur->next=tmpNode\x0d\x0apCur=pCur->next\x0d\x0a}\x0d\x0a\x0d\x0afclose(fp)\x0d\x0areturn i\x0d\x0a} \x0d\x0a\x0d\x0a//在vc++下编译。如果在TC下,可能还要做些小修改。\x0d\x0a//我在记事本上写的,你调试下吧!\x0d\x0a//有问题Hi我!

说实话,你这样写问题大。一般来说先建立一个头节点,在建立一个链表,里面包含头节点和计数器。

//链表节点定义

typedef struct _lnode

{

char name[20]

    char num[20]

struct _lnode *next

}lnode

typedef struct 

{

lnode head

int count

}link_list

这样一个链表的类型就定义好了。通过link_list这个类型来声明一个链表。

然后写插入、删除的函数,这里给你演示插入的函数:

//定义一个链表变量

link_list my_list

//初始化

int    init_list(link_list*  l)

{

      l->head.name[20] = {0}

      l->head.num[20] = {0}

  l->head.next = NULL 

  l->count = 0 

  return  0 

}

//从头增加链表节点

int insert_list_head(link_list* l, const char *name, const char *num)

{

/*新建结点*/

lnode*   pnew = (lnode*)malloc( sizeof(lnode) )

if(  NULL == pnew )

return  -1

strcpy(pnew->name, name)

strcpy(pnew->num, num)

pnew->next = NULL

/*在头部插入结点*/

pnew->next = l->head.next

l->head.next = pnew 

l->count ++ 

return  0

}

增加数据时,调用这个函数就行了。

接下来,往文件里写的话,用fopen打开文件,用fwrite往这个文件指针里写你的链表变量就行了。至于你说的什么组数完全没必要,文件里只写入一个链表,读的时候用link_list 这个类型声明一个变量去接收,如果想看读的效果,那就要另外写打印链表每个节点数据区内容的函数了。闲来无事,帮你写一个吧:

//比如要打印my_list里面的内容

struct _lnode *pnode = my_list.head.next

while(pnode != NULL)

{

    printf("%s, %s\t", pnode->name, pnode->char)

    pnode = pnode->next

}

printf("\n")

效果也可以看了,大功告成辣!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11723721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存