小型餐厅管理系统,我快要奔溃了,到底错在哪里呀,大家帮我来看看

qitilu 2018-01-23 11:47:02
大一,刚开始学c语言,这个题目是谭浩强的《c语言程序设计》配套练习的案例三,是一个可以把数据存储在磁盘的小型餐厅管理系统,但是存储数据后再重新运行程序显示数据时会有错误,我找了很久了也不知道错在哪里,求大家帮我看一下。
#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");
}
...全文
371 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-23
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
destory27 2018-01-23
  • 打赏
  • 举报
回复
链表使用的问题
 if(fread(&t,sizeof(guest),1,fp))
        {
            head=malloc(sizeof(guest));
            *head=t;
            count++;
            fread(&t,sizeof(guest),1,fp);
        }
next 有用过吗? head 移动了,之前的head有记录吗?
qitilu 2018-01-23
  • 打赏
  • 举报
回复
谢谢大家了!
qitilu 2018-01-23
  • 打赏
  • 举报
回复
在睡午睡的时候突然想到了错误所在,节点在内存中的地址我照样存储在磁盘,然后照样拿出来用,所以重新运行程序的时候会无法访问原来的内存地址,会出现错误。
自信男孩 2018-01-23
  • 打赏
  • 举报
回复
#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的地址下次再申请可能就不是上一个地址了。
ooolinux 2018-01-23
  • 打赏
  • 举报
回复
fp=fopen("guest.txt","wb") 二进制读写的文件最好不要以txt为扩展名。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧