#include"food.h" int main(void) { food_pnode h; foodlist_init(&h); foodlist_read(h); foodlist_show(h); return 0; } void foodlist_init(food_pnode *H) { *H=(food_pnode)malloc(sizeof(food_node)); if(NULL==*H){ printf("malloc error\n"); exit(-1); } INIT_LIST_HEAD(&(*H)->list); } void foodlist_creat(food_pnode h,food_node food_menu) { food_pnode new; new=(food_pnode)malloc(sizeof(food_node)); if(NULL==new){ printf("malloc error!\n"); exit(-1); } *new=food_menu; list_add_tail(&new->list,&h->list); } void foodlist_read(food_pnode h) { FILE *fp; food_node food_menu; int n=0; char buf[150]; fp=fopen("food.dat","r"); if(fp==NULL){ printf("open error\n"); exit(-1); } while(fgets(buf,1024,fp)) n++; fseek(fp,0,SEEK_SET); while(n--) { fscanf(fp,"%d%s%d",&food_menu.number,food_menu.name,&food_menu.price); foodlist_creat(h,food_menu); } fclose(fp); } void foodlist_show(food_pnode h) { struct list_head *pos,*n; food_pnode p; list_for_each_safe(pos,n,&(h->list)) { p=list_entry(pos,food_node,list); printf("%d\t%s\t%d\t\n",p->number,p->name,p->price); } }
思路:1.内核链表初始化,创建一个内核链表类型的头结点
INIT_LIST_HEAD(&(*H)->list);
2.打开文件fp=fopen("food.dat","r");
3.创建一个结构体 接受文件读出来的每行
food_node food_menu;
4.计算行数
while(fgets(buf,1024,fp))
n++;
5.定位到文件开头
fseek(fp,0,SEEK_SET);
6.边读边创建
fscanf(fp,"%d%s%d",&food_menu.number,food_menu.name,&food_menu.price);
foodlist_creat(h,food_menu);
7.创建用new=(food_pnode)malloc(sizeof(food_node));
8.把读出的内容赋给新结点
*new=food_menu;
9.list_add_tail(&new->list,&h->list);插到表尾
10. 遍历显示
原文:http://www.cnblogs.com/tongusir/p/3649421.html