C语言从文件中读取一个链表(文件中不全是链表数据)

文件中第一行是一个数,表示struct的组数,后面是链表数据,一组由两行构成,第一行是名字,第二行是编号,我的代码:FILE*fp1;intn,i,j;charch;if... 文件中第一行是一个数,表示struct的组数,后面是链表数据,一组由两行构成,第一行是名字,第二行是编号,我的代码:
FILE *fp1;
int n,i,j;
char ch;
if((fp1=fopen("directory.in","r"))==NULL){
printf("File open error!\n");
exit(0);}
struct node{
char name[20];
char num[20];
struct node *next;
}*p,*q,*l;

l=(struct node*)malloc(sizeof(struct node));这一段我是参考另一个百度知道写的,不知道什么意思,求解
l->next=NULL;
q=(struct node*)malloc(sizeof(struct node));
q=l;
p = (struct node*)malloc(sizeof(struct node));

n=fgetc(fp1)-48;
fgetc(fp1);
for(i=0;i<n;i++)
{
for(j=0;(ch=fgetc(fp1))!='\n';j++)
p->name[j]=ch;
for(j=0;(ch=fgetc(fp1))!='\n';j++)
p->num[j]=ch;
p->next=NULL

q->next=p;
q=p;
}
首先声明我没学过如何载入链表,完全是看百度自己捣鼓试着来的,请海涵,帮忙看看这样读行不行?
链表数据是这样的:
2
jiang
501
yan
203
展开
 我来答
竹叶兰之夏
推荐于2016-05-10 · 超过63用户采纳过TA的回答
知道小有建树答主
回答量:83
采纳率:0%
帮助的人:78.4万
展开全部

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

//链表节点定义
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");

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

追问
请问link_list 是什么数据类型?我用vs2010貌似不支持
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式