函数参数 link 是链表头结点,修改如下,供参考:
void read(struct book * link)
{
FILE *fp;
fp = fopen("book.txt", "r");
if (fp == NULL){
printf("open file fail!\n");
return;
}
struct book *p1 = link, *pnew = NULL;
while (1){
pnew = (struct book*)malloc(sizeof(struct book));
pnew->next = NULL;
if (fscanf(fp,"%d %s %s %s %d %d %d %ld\n",&pnew->ISBN, pnew->name,pnew->writer,
pnew->press, &pnew->date[0], &pnew->date[1], &pnew->date[2], &pnew->price) != 8)
{
free(pnew);
break;
}
p1->next = pnew;
p1 = pnew;
}
fclose(fp);
return;
}
其实就是我刚刚讲的那个相邻位置互换的进阶操作。多加一个循环来实现就可以。定义三个指针的好处就是,p指针来标记位置,p1和p2用来实现调换位置的功能。
由于上面所讲可以看出,要想调换两个节点的位置,我们至少需要知道调换节点的前一个的位置。也就是说,要想调换2,3节点的位置,必须要知道1节点的位置,否则,1节点无法指向3节点的位置致使操作失败。