------------以下是源码
#include
#include
#define N 30
struct recipe{
char food[10];
float price;
struct recipe *next;
};
struct recipe* creat()
{ int x;
int i=0;
struct recipe *head,*p,*tail;
head=tail=NULL;
printf("请输入新添加的菜品数量:");
scanf("%d",&x);
for(i=0;i<x;i++){
p=(struct recipe *)malloc(sizeof(struct recipe));
if(p==NULL)
{ printf("分配内存失败.");
exit(1);
}
printf("请输入菜品的名称:");
scanf("%s",p->food);
printf("请输入菜品价格:");
scanf("%f",p->price);
p->next=NULL;
if(head==NULL)
{
head=tail=p;
}
else
{ tail->next=p;
tail=p;
}
}
return head;
}
void choosemenu(){
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[1]输入新的菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[2]查看现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[3]修改现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[4]查找现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[5]删除现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[6]保存修改菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[7]退出菜品信息管理系统\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦请选择: \t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");
}
void choice(){
/*switch(n){
case '1':inputInformation();
break;
case '2':showInformation();
break;
case '3':changeInformation();
break;
case '4':searchInformation();
break;
case '5':deleteInformation();
break;
case '6':saveInformation();
break;
case '7':printf("Thanks for your use!\n\n\n\n");
break;
default:choosemenu();
printf("输入有误,请重新输入.\n");
}*/
}
void main(){
int n;
struct recipe *head=NULL;
printf("--------------------欢迎进入订餐管理系统--------------------------\n");
printf("-------首次进入请确认你已写好菜品信息--------\n");
head=creat();
choosemenu();
while(n!=7){
scanf("%c",&n);
choice();
}
system("pause");
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#define N 30
struct recipe {
char food[10];
float price;
struct recipe next;
};
struct recipe creat()
{
int x;
int i = 0;
struct recipe *head, *p, *tail;
head = tail = NULL;
printf("请输入新添加的菜品数量:");
scanf("%d", &x);
for (i = 0; i p = (struct recipe *)malloc(sizeof(struct recipe));
if (p == NULL)
{
printf("分配内存失败.");
exit(1);
}
printf("请输入菜品的名称:");
scanf("%s", p->food);
printf("请输入菜品价格:");
scanf("%f", &p->price);
p->next = NULL;
if (head == NULL)
{
head = tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
return head;
}
void choosemenu() {
printf("\t?????????????????????[1]输入新的菜品信息\t?????????????????????\n");
printf("\t?????????????????????[2]查看现有菜品信息\t?????????????????????\n");
printf("\t?????????????????????[3]修改现有菜品信息\t?????????????????????\n");
printf("\t?????????????????????[4]查找现有菜品信息\t?????????????????????\n");
printf("\t?????????????????????[5]删除现有菜品信息\t?????????????????????\n");
printf("\t?????????????????????[6]保存修改菜品信息\t?????????????????????\n");
printf("\t?????????????????????[7]退出菜品信息管理系统\t?????????????????????\n");
printf("\t?????????????????????请选择: \t?????????????????????\n");
}
void choice(int n) {
/*switch(n){
case '1':inputInformation();
break;
case '2':showInformation();
break;
case '3':changeInformation();
break;
case '4':searchInformation();
break;
case '5':deleteInformation();
break;
case '6':saveInformation();
break;
case '7':printf("Thanks for your use!\n\n\n\n");
break;
default:choosemenu();
printf("输入有误,请重新输入.\n");
}*/
}
void main() {
int n;
struct recipe *head = NULL;
printf("--------------------欢迎进入订餐管理系统--------------------------\n");
printf("-------首次进入请确认你已写好菜品信息--------\n");
head = creat();
choosemenu();
while ((scanf("%d", &n))==1&&n != 7) {
choice(n);
}
system("pause");
}
很明显,非法访问值为NULL的指针,调试一下看看那个变量为NULL,在没有赋值前你使用了
看一下函数说明:
int scanf ( Forma [, Pointer, ... ])
楼上说的对,p->price是一个float,不是一个指针,而scanf第二个参数必须是指针,可以加一个&来取地址:&p->price。
你的代码struct recipe creat(),在循环中的scanf,运行到读取价格的scanf时,输入价格后将值写入price指向的地址,因为不是一个合法的地址(实际地址可以看做为浮点数28),就报错了。