求大虾们看看哪里出问题了
今年大一刚开始学C语言,写了一个记账的程序,但一直编译不成功。开始编了,用顺序方式的可以运行,但换了链表后就编译不行了,求看看哪里出问题,,
谢谢谢谢!!!
#include<stdio.h>#include<stdlib.h>#include<string.h>struct Money{ int num; char date[20]; int mon; char used[80]; struct Money *next;}index,*first;void Add();void show();void Delete_1();void exito();void input(struct Money*p)void printf_menu();void Add(){ char check; struct Money *p=(struct Money*)malloc(sizeof(struct Money)); struct Money *last; if(first==NULL) first=p; else { last=getlast(*first); last->next=p; } input(*p); printf("是否继续输入?Y是,N不是"); scanf("%c",&check); if(check=='Y'||check=='y')Add(); else printf_menu();}void Delete_1(){ int num_no; int count=0; struct Money *p=first; printf("请输入要删除的数据编号:"); scanf("%d",&num_no); if(p->num==num_no) { first=first->next; count=1; } else { while((p->next)!=NULL) { if(((p->next)->num)==num_no) { p->next=((p->next)->next); count=1; break; } p=p->next; } } if(count==0)printf("编号%d不存在",num_no); else printf("删除成功"); printf_menu();}void show(){ struct Money *p; printf("+----+-------+------+-------------------------+"); printf("|编号| 日 期 | 金 额| 使用原因 |"); printf("+----+-------+------+-------------------------+"); p=first; while(p!=NULL) { printf("|%d|%s|%d|%s|",p->num,p->date,p->mon,p->used); printf("+----+-------+------+-------------------------+"); p=p->next; } printf_menu();}void exito(){ struct Money *p; p=first; while(p!=NULL) { free(p); p=p->next; } exit(0);}struct Money * getlast(struct Money *p){ while(p!=NULL) { p=p->next; } return(p);}void input(struct Money *p){ int num_no,count=0; struct Money *p1; do { printf("请输入编号:"); scanf("%d",&num_no); p1=first; if(p1->num==num_no)printf("编号存在,请重新输入"); else count=1; p1=p1->next; }while(count==0); p->num=num_no; printf("请输入日期:(格式年-月-日)"); scanf("%s",p->date); printf("请输入使用金额:"); scanf("%d",&p->mon); printf("请输入使用原因:"); scanf("%s",p->used); p->next=NULL;}void printf_menu(){ int id_choose; printf("+------------------------------------+\n"); printf("| |\n"); printf("+------------------------------------+\n"); printf("|1.添加数据 (Add) |\n"); printf("+------------------------------------+\n"); printf("|2.删除数据 (Delete) |\n"); printf("+------------------------------------+\n"); printf("|3.展示数据 (Show) |\n"); printf("+------------------------------------+\n"); printf("|4.退出系统 (Exit) |\n"); printf("+------------------------------------+\n"); scanf("%d",&id_choose); while(id_choose>4||id_choose<1) { printf("输入错误,请重新输入1-4\n"); scanf("%d",&id_choose); } switch(id_choose) { case 1:Add();break; case 2:Delete_1();break; case 3:show();break; case 4:exito();break; }}int main(){ printf_menu();}
#include<stdio.h>#include<stdlib.h>#include<string.h>struct Money{ int num; char date[20]; int mon; char used[80]; struct Money *next;}index,*first;void Add();void show();void Delete_1();void exito();void input(struct Money*p);void printf_menu();struct Money * getlast(struct Money *p);void Add(){ char check; struct Money *p=(struct Money*)malloc(sizeof(struct Money)); struct Money *last; if(first==NULL) first=p; else { last=getlast(first); last->next=p; } input(p); printf("是否继续输入?Y是,N不是"); scanf(" %c",&check); if(check=='Y'||check=='y')Add(); else printf_menu();}void Delete_1(){ int num_no; int count=0; struct Money *p=first; printf("请输入要删除的数据编号:"); scanf("%d",&num_no); //这里是否该增加一个判断链表是否为空的语句?以防止无数据时删除,产生错误 if(p->num==num_no) { first=first->next; count=1; } else { while((p->next)!=NULL) { if(((p->next)->num)==num_no) { p->next=((p->next)->next); count=1; break; } p=p->next; } } if(count==0)printf("编号%d不存在",num_no); else printf("删除成功"); printf_menu();}void show(){ struct Money *p; printf("+----+-------+------+-------------------------+"); printf("|编号| 日 期 | 金 额| 使用原因 |"); printf("+----+-------+------+-------------------------+"); p=first; while(p!=NULL) { printf("|%d|%s|%d|%s|",p->num,p->date,p->mon,p->used); printf("+----+-------+------+-------------------------+"); p=p->next; } printf_menu();}void exito(){ struct Money *p; p=first; while(p!=NULL) { free(p); p=p->next; } exit(0);}struct Money * getlast(struct Money *p){ while(p!=NULL) { p=p->next; } return(p);}void input(struct Money *p){ int num_no,count=0; struct Money *p1; do { printf("请输入编号:"); scanf(" %d",&num_no); p1=first; if(p1->num==num_no)printf("编号存在,请重新输入"); else count=1; p1=p1->next; }while(count==0); p->num=num_no; printf("请输入日期:(格式年-月-日)"); scanf(" %s",p->date); printf("请输入使用金额:"); scanf(" %d",&p->mon); printf("请输入使用原因:"); scanf(" %s",p->used); p->next=NULL;}void printf_menu(){ int id_choose; printf("+------------------------------------+\n"); printf("| |\n"); printf("+------------------------------------+\n"); printf("|1.添加数据 (Add) |\n"); printf("+------------------------------------+\n"); printf("|2.删除数据 (Delete) |\n"); printf("+------------------------------------+\n"); printf("|3.展示数据 (Show) |\n"); printf("+------------------------------------+\n"); printf("|4.退出系统 (Exit) |\n"); printf("+------------------------------------+\n"); scanf("%d",&id_choose); while(id_choose>4 || id_choose<1) { printf("输入错误,请重新输入1-4\n"); scanf(" %d",&id_choose); } switch(id_choose) { case 1:Add();break; case 2:Delete_1();break; case 3:show();break; case 4:exito();break; }}int main(){ printf_menu();}