void* myInsert(SUB *subj) //链表插入操作
{
SUB *ptr,*ptr2;
ptr=subj;//要传入的节点
if(head==NULL)//头节点为空,说明链表为空链表
{
head=ptr;//将头节点设置为要传入的节点
head->next=NULL;//指针域设为空
}
else//链表不为空
{
for(ptr2=head;ptr2;ptr2=ptr2->next)//从链表头开始找,找到目前最后一个节点
{
if(ptr2->next==NULL)//若当前ptr2是链表最后一个节点
{
ptr2->next=subj;//在链表尾增加一个节点subj
subj->next=NULL;//将新节点的指针域置为空结束链表
break;
}
}
}
return head;
}
void readfile() //阅读文件
{
void *myInsert(SUB*);
SUB *newSub; //新课程
int num,stime,ttime,etime;
int score,term;
char c,name[20],kind[10],fname[20];
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变
fp=fopen("2-2.txt","r");
while(!feof(fp))//文件没有结束
{
newSub=(SUB*)malloc(sizeof(SUB));
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&newSub->num,newSub->name,newSub->kind,&newSub->stime,
&newSub->ttime,&newSub->etime,&newSub->score,&newSub->term);
myInsert(newSub);
}
fclose(fp);
}
36行的while当读取到文件尾的时候就循环结束了
第二个函数是从文件中读取出数据形成链表节点,然后用第一个函数将新的链表节点加入到链表尾部
1、第二个自定义函数中while循环是如何结束的
读文件,文件结束feof(fp)为false,程序退出;
2、在第二个函数中用第一个函数有什么作用?
myIsert函数是链表的尾插,将文件读取到链表中保存
第二个函数的while,feof(fp)是判断文件是否读到结尾,如果文件读到结尾了,循环就结束了。
第二个函数读取文件并将文件按行读取成成指定的数据结构,再调用第一个函数将数据插入到链表的尾部。
1.feof(fp)用于判断文件是否读到的是EOF,它只判断,并不真正读取,取反之后就代表文件没有到达结尾
2.fscanf读取文件并保存在newSub中, myInsert(newSub)将它插入链表