匿名用户
1级
2012-05-21 回答
你的描述不清晰,B1和B2两个结构数组,到底要删除哪个?B[2]是肯定不对的,这两个数组的长度都是2,下标只能是0和1,即B1[0], B1[1], B2[0], B2[1]。
你还是先把问题说清楚了,这个程序不难写。
追问:
不好意思漏掉了! 是要删除B2[1].name 和 B2[1].point
麻烦大侠指教!
追答:
还不是很清楚,文件里存了哪几条数据?数据在B1和B2里是如何存放的。以B2为例,B2[0]或B2[1],每个里存放一条数据还是用链表串起来的多条数据?
我按如下的假设实现:
文件中vip的数据以文本方式存储(假设文件名为vip.txt),每一条数据存一个会员姓名和会员积分信息,用空格分给,每条记录结束是一个回车符。数据读取出来之后放入B2[1]为头的链表中,然后将B2[1]代表的数据删除(即第一条记录),把其余部分的数据重新写入到文件中。
前面的定义略
main()
{
FILE *fp;
struct vip *ptr, buf;
fp = fopen("vip.txt", "r");
if(fp == NULL) {
printf("Can not open file vip.txt\n");
exit(-1);
}
ptr = NULL;
/* 读取vip.txt中的数据,存放在B2[1]为头的链表中 */
while(fscanf(fp, "%s %d", buf.name, &buf.point) != EOF) {
if(ptr = NULL)
ptr = &B2[1];
else {
ptr->next = (struct vip *)malloc(sizeof(struct vip));
ptr = ptr->next;
}
strcpy(ptr->name, buf.name);
ptr->point= buf.point;
ptr->next = NULL;
}
fclose(fp);
/* 将文件中的内容显示在屏幕上 */
ptr = &B2[1];
while(ptr) {
printf("%s %d\n", ptr->name, ptr->point);
ptr = ptr->next;
}
/* 删除B2[1]的内容 */
fp = fopen("vip.txt", "w"));
if(fp == NULL) {
printf("Can not write file vip.txt\n");
/* 释放列表中分配的内存空间,很简单,实现略 */
exit(-2);
}
/* 删除第一条记录,用第二条记录的值代替第一条 */
ptr = B2[1]->next;
if(ptr != NULL) {
strcpy(B2[1].name, ptr->name);
B2[1].point = ptr->point;
B2[1].next = ptr->next;
free(ptr);
}
/* 将新的链表保存到文件中 */
ptr = &B2[1];
while(ptr) {
fprintf(fp, "%s %d\n", ptr->name, ptr->point);
ptr = ptr->next;
}
fclose(fp);
/* 释放分配的内存,实现略 */
}