33,311
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 4
typedef struct guest_info
{
int number;
char name[15];
int sum;
char time[15];
struct guest_info *next;
} guest;
int main()
{
guest *insert(guest *a,int *count);
void search(guest *a,int *count);
void update(guest *a,int *count);
guest *del(guest *a,int *count);
void show(guest *a);
FILE *fp;
guest *head,*p,t;
int count,s,k;
count=0;
head=NULL;
if((fp=fopen("guest.txt","rb"))!=NULL)
{
if(fread(&t,sizeof(guest),1,fp))
{
head=malloc(sizeof(guest));
*head=t;
count++;
fread(&t,sizeof(guest),1,fp);
}
for(;!feof(fp);)
{
p=malloc(sizeof(guest));
*p=t;
count++;
fread(&t,sizeof(guest),1,fp);
}
}
fclose(fp);
do
{
printf("1---insert\n2---search\n3---update\n4---delete\n5---show\n6---exit\n");
scanf("%d",&s);
switch(s)
{
case 1:head=insert(head,&count);break;
case 2:search(head,&count);break;
case 3:update(head,&count);break;
case 4:head=del(head,&count);break;
case 5:show(head);break;
case 6:break;
default:printf("Enter data error,please enter again.\n");
}
}while(s!=6);
if((fp=fopen("guest.txt","wb"))==NULL)
{
printf("Build file error!\n");
return;
}
for(p=head;p!=NULL;p=p->next)
{
fwrite(p,sizeof(guest),1,fp);
}
fclose(fp);
return 0;
}
guest *insert(guest *head,int *count)
{
int k;
guest t,*p,*p2;
k=0;
if(*count>=MAX)
{
printf("There is no room!\n");
return head;
}
printf("Please enter data of guest(roomnumber/name/sum/time):\n");
scanf("%d%s%d%s",&t.number,t.name,&t.sum,t.time);
for(p=head;p!=NULL;p=p->next)
{
if(p->number==t.number)
{
k=1;
break;
}
p2=p;
}
if(!k)
{
p=malloc(sizeof(guest));
*p=t;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
p2->next=p;
}
(*count)++;
printf("Enter data success!\n");
}
else
{
printf("There is also a same room number.So insert data fail.\n");
}
return head;
}
void search(guest *head,int *count)
{
int k,num;
guest *p;
k=0;
printf("Please enter roomnumber:\n");
scanf("%d",&num);
for(p=head;p!=NULL;p=p->next)
{
if(p->number==num)
{
k=1;
printf("The data of roomnumber %d:\n",num);
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
break;
}
}
if(!k)
{
printf("There is no data of the room number.\n");
}
}
void update(guest *head,int *count)
{
int k,num;
guest *p;
k=0;
printf("Please enter roomnumber you want update:\n");
scanf("%d",&num);
for(p=head;p!=NULL;p=p->next)
{
if(p->number==num)
{
k=1;
printf("The original data of the room number:\n");
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
printf("Please enter the data of update(number/name/sum/time)\n");
scanf("%d%s%d%s",&p->number,p->name,&p->sum,p->time);
printf("Update data success!\n");
}
}
if(!k)
{
printf("There is no data of the roomnumber.\n");
}
}
guest *del(guest *head,int *count)
{
int j,k,num;
guest *p,*p2;
k=0;
printf("Please enter the roomnumber you want to delete:\n");
scanf("%d",&num);
for(p=head;p!=NULL;p=p->next)
{
if(p->number==num)
{
k=1;
printf("The original data of the roomnumber:\n");
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
printf("Do you want to delete it(y/n)?\n");
fflush(stdin);
if(getchar()=='y')
{
if(p==head)
{
head=head->next;
}
else
{
p2->next=p->next;
}
(*count)--;
printf("delete data success!\n");
}
break;
}
p2=p;
}
if(!k)
{
printf("There is no data of the roomnumber.\n");
}
return head;
}
void show(guest *head)
{
guest *p;
printf("The data of the hotel:\n");
printf("========================\n");
printf("roomnumber/name/sum/time\n");
for(p=head;p!=NULL;p=p->next)
{
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
}
printf("========================\n");
}
if(fread(&t,sizeof(guest),1,fp))
{
head=malloc(sizeof(guest));
*head=t;
count++;
fread(&t,sizeof(guest),1,fp);
}
next 有用过吗? head 移动了,之前的head有记录吗?#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 4
typedef struct guest_info
{
char name[16];
char time[16];
int sum;
int number;
struct guest_info *next;
} guest;
guest *insert(guest *a,int *count);
void search(guest *a,int *count);
void update(guest *a,int *count);
guest *del(guest *a,int *count);
void show(guest *a);
int main()
{
FILE *fp;
guest *head,*p,t, *pcur, *prev;
int count,s,k;
count = 0;
head = NULL;
if((fp = fopen("guest.txt","rb"))!=NULL)
{
if(fread(&t,sizeof(guest),1,fp)) {
head = (guest *)malloc(sizeof(guest));
*head = t;
prev = head;
count++;
}
while (!feof(fp)) {
if (fread(&t,sizeof(guest),1,fp) != 1)
break;
pcur = (guest *)malloc(sizeof(guest));
if (!pcur) {
fprintf(stderr, "malloc error!\n");
exit(0);
}
*pcur = t;
prev->next = pcur;
prev = pcur;
count++;
}
prev->next = NULL;
fclose(fp);
}
show(head);
printf("%d\n", count);
do
{
printf("1---insert\n2---search\n3---update\n4---delete\n5---show\n6---exit\n");
scanf("%d",&s);
switch(s)
{
case 1:
head=insert(head,&count);break;
case 2:
search(head,&count);break;
case 3:
update(head,&count);break;
case 4:head=del(head,&count);break;
case 5:show(head);break;
case 6:break;
default:printf("Enter data error,please enter again.\n");
}
}while(s!=6);
if((fp=fopen("guest.txt","wb"))==NULL) {
printf("Build file error!\n");
return -1;
}
for(p=head;p;p=p->next) {
fwrite(p,sizeof(guest),1,fp);
printf("%d\n", 1);
}
fclose(fp);
return 0;
}
guest *insert(guest *head,int *count)
{
int k;
guest t,*p,*p2;
if(*count>=MAX) {
printf("There is no room!\n");
return head;
}
printf("Please enter data of guest(roomnumber/name/sum/time):\n");
scanf("%d%s%d%s",&t.number,t.name,&t.sum,t.time);
k = 0;
for(p=head;p;p=p->next)
{
if(p->number==t.number)
{
k=1;
break;
}
p2 = p;
}
if(!k) {
p = (guest *)malloc(sizeof(guest));
*p = t;
p->next = NULL;
if(!head)
head = p;
else
p2->next=p;
(*count)++;
printf("Enter data success!\n");
}
else {
printf("There is also a same room number.So insert data fail.\n");
}
return head;
}
void search(guest *head,int *count)
{
int k,num;
guest *p;
k = 0;
printf("Please enter roomnumber:\n");
scanf("%d", &num);
for(p=head;p!=NULL;p=p->next)
{
if(p->number==num)
{
k=1;
printf("The data of roomnumber %d:\n",num);
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
break;
}
}
if(!k)
printf("There is no data of the room number.\n");
}
void update(guest *head,int *count)
{
int k,num;
guest *p;
printf("Please enter roomnumber you want update:\n");
scanf("%d",&num);
k=0;
for(p=head;p;p=p->next) {
if(p->number==num) {
k=1;
printf("The original data of the room number:\n");
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
printf("Please enter the data of update(number/name/sum/time)\n");
scanf("%d%s%d%s",&p->number,p->name,&p->sum,p->time);
printf("Update data success!\n");
}
}
if(!k)
printf("There is no data of the roomnumber.\n");
}
guest *del(guest *head,int *count)
{
int j,k,num;
guest *p,*p2;
printf("Please enter the roomnumber you want to delete:\n");
scanf("%d",&num);
k=0;
for(p=head;p!=NULL;p=p->next)
{
if(p->number==num)
{
k=1;
printf("The original data of the roomnumber:\n");
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
printf("Do you want to delete it(y/n)?\n");
//fflush(stdin);
getchar();
if(getchar()=='y') {
if(p == head)
head = head->next;
else
p2->next = p->next;
(*count)--;
printf("delete data success!\n");
}
break;
}
p2 = p;
}
if(!k)
printf("There is no data of the roomnumber.\n");
return head;
}
void show(guest *head)
{
guest *p;
printf("The data of the hotel:\n");
printf("========================\n");
printf("roomnumber/name/sum/time\n");
for(p=head;p!=NULL;p=p->next)
printf("%d %s %d %s\n",p->number,p->name,p->sum,p->time);
printf("========================\n");
}
参考一下吧
读文件,读出的数据并没有组成链表而是一个个独立的节点;另外,虽然将next也写入的文件,但是这个地址是变化的,上次申请malloc的地址下次再申请可能就不是上一个地址了。