问题遇到的现象和发生背景
主函数中建立一个主菜单,在主菜单中建立了两个子表,一个是普通用户入口,另一个是管理员入口,管理员入口中建立顺序表后,使用管理员界面的功能能都好使,但是退回到主菜单时,进入普通用户的子表中,函数不好使
问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define MaxSize 20
typedef struct
{
int couriernum;//快递单号
char state[MaxSize];//快递状态
char addressorname[MaxSize];//发件人名字
char addressoradd[MaxSize];//发件人地址
int addressorpnum;//发件人电话
int addressorpcode;//发件人邮政编码
char addresseename[MaxSize];//收件人名字
char addresseeadd[MaxSize];//收件人地址
int addresseepnum;//收件人电话
int addresseepcode;//收件人邮政编码
}inquire;//物流信息
typedef struct LNode
{
inquire data[MaxSize];
int length;
}SqList;
void KDDHCX(SqList *L)
{
int i,j;
printf("请输入您要查询的快递单号\n");
scanf("%d",&i);
for(j=1;j<=L->length;j++)
{
if(i==L->data[j-1].couriernum)
{
printf("快递单号为%d\n",L->data[j-1].couriernum);
printf("快递状态为%s\n",L->data[j-1].state);
printf("发件人名称为%s\n",L->data[j-1].addressorname);
printf("发件人地址为%s\n",L->data[j-1].addressoradd);
printf("发件人联系电话为%d\n",L->data[j-1].addressorpnum);
printf("发件人邮政编码为%d\n",L->data[j-1].addressorpcode);
printf("收件人姓名为%s\n",L->data[j-1].addresseename);
printf("收件人地址为%s\n",L->data[j-1].addresseeadd);
printf("收件人联系电话为%d\n",L->data[j-1].addresseepnum);
printf("收件人邮政编码为%d\n",L->data[j-1].addresseepcode);
}
}
}
void DHCX(SqList *L)//感觉没必要搞这么麻烦
{
int i,j,a,b;
printf("您要查询的电话号码是谁的\n");
printf("收件人请输入1\n");
printf("发件人请输入2\n");
scanf("%d",&i);
if(i==1)
{
printf("请输入收件人的电话号码\n");
scanf("%d",&a);
for(j=1;j<=L->length;j++)
{
if(a==L->data[j-1].addresseepnum)
{
printf("快递单号为%d\n",L->data[j-1].couriernum);
printf("快递状态为%s\n",L->data[j-1].state);
printf("发件人名称为%s\n",L->data[j-1].addressorname);
printf("发件人地址为%s\n",L->data[j-1].addressoradd);
printf("发件人联系电话为%d\n",L->data[j-1].addressorpnum);
printf("发件人邮政编码为%d\n",L->data[j-1].addressorpcode);
printf("收件人姓名为%s\n",L->data[j-1].addresseename);
printf("收件人地址为%s\n",L->data[j-1].addresseeadd);
printf("收件人联系电话为%d\n",L->data[j-1].addresseepnum);
printf("收件人邮政编码为%d\n",L->data[j-1].addresseepcode);
}
}
}
if(i==2)
{
printf("请输入发件人的电话号码\n");
scanf("%d",&b);
for(j=1;j<=L->length;j++)
{
if(a==L->data[j-1].addresseepnum)
{
printf("快递单号为%d\n",L->data[j-1].couriernum);
printf("快递状态为%s\n",L->data[j-1].state);
printf("发件人名称为%s\n",L->data[j-1].addressorname);
printf("发件人地址为%s\n",L->data[j-1].addressoradd);
printf("发件人联系电话为%d\n",L->data[j-1].addressorpnum);
printf("发件人邮政编码为%d\n",L->data[j-1].addressorpcode);
printf("收件人姓名为%s\n",L->data[j-1].addresseename);
printf("收件人地址为%s\n",L->data[j-1].addresseeadd);
printf("收件人联系电话为%d\n",L->data[j-1].addresseepnum);
printf("收件人邮政编码为%d\n",L->data[j-1].addresseepcode);
}
}
}
}
void menu1(SqList *L)
{
int a;
do{
printf("________________________\n");
printf("______普通用户界面______\n");
printf("_____1.快递单号查找_____\n");
printf("_____2.按照电话查找_____\n");//原题未有
printf("______0.返回主菜单______\n");
printf("________________________\n");
printf("请输入您要进行的选项\n");
scanf("%d",&a);
switch(a)
{
case 1:
KDDHCX(L);
break;
case 2:
DHCX(L);
break;
case 0:
return;
default:
{
printf("输入有误,请重新输入\n");
break;
}
}
}while(1);
}
void InitList(SqList *&L)//初始化
{
L=(SqList*)malloc(sizeof(SqList));
L->length=0;
}
void XXLR(SqList *&L,int i)//信息录入
{
int j;
InitList(L);
printf("请依次输入每个快递的信息\n");
for(j=1;j<=i;j++)
{
printf("请输入快递单号\n");
scanf("%d",&L->data[j-1].couriernum);
printf("请输入快递状态\n");
scanf("%s",&L->data[j-1].state);
printf("请输入发件人姓名\n");
scanf("%s",&L->data[j-1].addressorname);
printf("请输入发件人地址\n");
scanf("%s",&L->data[j-1].addressoradd);
printf("请输入发件人联系电话\n");
scanf("%d",&L->data[j-1].addressorpnum);
printf("请输入发件人邮政编码\n");
scanf("%d",&L->data[j-1].addressorpcode);
printf("请输入收件人姓名\n");
scanf("%s",&L->data[j-1].addresseename);
printf("请输入收件人地址\n");
scanf("%s",&L->data[j-1].addresseeadd);
printf("请输入收件人联系电话\n");
scanf("%d",&L->data[j-1].addresseepnum);
printf("请输入收件人邮政编码\n");
scanf("%d",&L->data[j-1].addresseepcode);
L->length++;
}
}
void XMCX(SqList *L)//按照姓名查找
{
int i;
char name[5];
bool a;
printf("请输入您要查询的收件人姓名\n");
getchar();
scanf("%s",name);
for(i=0;i<L->length;i++)
{
a=false;
if(strcmp(L->data[i].addresseename,name)==0)
{
printf("查询成功\n");
printf("该收件人的快递单号是%d\n",L->data[i].couriernum);
printf("该收件人的快递状态是%s\n",L->data[i].state);
a=true;
}
}
if(a==false)
{
printf("未查询到您所查询的收件人姓名\n");
}
}
void XGZT(SqList*&L)//修改快递状态
{
int a,j;
char b[20];
printf("请输入快递单号\n");
scanf("%d",&a);
for(j=1;j<L->length;j++)
{
if(a==L->data[j-1].couriernum)
{
printf("请输入新的快递状态:\n");
getchar();
scanf("%s",b);
strcpy(L->data[j-1].state,b);
printf("快递单号为%d\n",L->data[j-1].couriernum);
printf("快递状态为%s\n",L->data[j-1].state);
printf("发件人名称为%s\n",L->data[j-1].addressorname);
printf("发件人地址为%s\n",L->data[j-1].addressoradd);
printf("发件人联系电话为%d\n",L->data[j-1].addressorpnum);
printf("发件人邮政编码为%d\n",L->data[j-1].addressorpcode);
printf("收件人姓名为%s\n",L->data[j-1].addresseename);
printf("收件人地址为%s\n",L->data[j-1].addresseeadd);
printf("收件人联系电话为%d\n",L->data[j-1].addresseepnum);
printf("收件人邮政编码为%d\n",L->data[j-1].addresseepcode);
break;
}
}
}
void ZTXX(SqList *&L,int j)//增添信息
{
int a;
for(a=L->length+1;a<L->length+1+j;a++)
{
printf("请输入快递单号\n");
scanf("%d",&L->data[a-1].couriernum);
printf("请输入快递状态\n");
scanf("%s",&L->data[a-1].state);
printf("请输入发件人姓名\n");
scanf("%s",&L->data[a-1].addressorname);
printf("请输入发件人地址\n");
scanf("%s",&L->data[a-1].addressoradd);
printf("请输入发件人联系电话\n");
scanf("%d",&L->data[a-1].addressorpnum);
printf("请输入发件人邮政编码\n");
scanf("%d",&L->data[a-1].addressorpcode);
printf("请输入收件人姓名\n");
scanf("%s",&L->data[a-1].addresseename);
printf("请输入收件人地址\n");
scanf("%s",&L->data[a-1].addresseeadd);
printf("请输入收件人联系电话\n");
scanf("%d",&L->data[a-1].addresseepnum);
printf("请输入收件人邮政编码\n");
scanf("%d",&L->data[a-1].addresseepcode);
}
L->length+=j;
}
void DispList(SqList *L)
{
int i;
for(i=0;i<L->length;i++)//使用一个for循环将每个元素输出
{
printf("快递单号为%d\n",L->data[i].couriernum);
printf("快递状态为%s\n",L->data[i].state);
printf("发件人名称为%s\n",L->data[i].addressorname);
printf("发件人地址为%s\n",L->data[i].addressoradd);
printf("发件人联系电话为%d\n",L->data[i].addressorpnum);
printf("发件人邮政编码为%d\n",L->data[i].addressorpcode);
printf("收件人姓名为%s\n",L->data[i].addresseename);
printf("收件人地址为%s\n",L->data[i].addresseeadd);
printf("收件人联系电话为%d\n",L->data[i].addresseepnum);
printf("收件人邮政编码为%d\n",L->data[i].addresseepcode);
}
}
void menu2(SqList *L)
{
int b;
int i,j;
do{
printf("________________________\n");
printf("______管理用户界面______\n");
printf("_______1.信息录入_______\n");
printf("2.按照收件人名查快递状态\n");
printf("__3.按快递单号修改状态__\n");
printf("_____4.增添快递信息_____\n");//原题未有
printf("5.输出现在所有的快递信息\n");
printf("______0.返回主菜单______\n");
printf("________________________\n");
printf("请输入您要进行的选项\n");
scanf("%d",&b);
switch(b)
{
case 1:
printf("请输入您要录入信息的数量\n");
scanf("%d",&i);
XXLR(L,i);
break;
case 2:
XMCX(L);
break;
case 3:
XGZT(L);
break;
case 4:
printf("请输入新到达的快递件数:\n");
scanf("%d",&j);
ZTXX(L,j);
break;
case 5:
DispList(L);
break;
case 0:
return;
break;
default:
{
printf("输入有误,请重新输入\n");
break;
}
}
}while(1);
}
int main()
{
int i;
char a[10],b[10];
char zhanghu[10]="200450804";
char mima[10]="123456";
int j=1;
SqList *L=NULL;
do{
printf("________________________\n");
printf("____物流信息管理系统____\n");
printf("_____1.普通用户入口_____\n");
printf("_____2.管理人员入口_____\n");
printf("_______0.退出入口_______\n");
printf("________________________\n");
printf("请输入您要进行的选项\n");
scanf("%d",&i);
switch(i)
{
case 1://建立一个普通用户的界面
menu1(L);
break;
case 2://管理界面(要有账户密码)
printf("请输入账户\n");
scanf("%s",&a);
printf("请输入密码\n");
scanf("%s",&b);
if(strcmp(zhanghu,a)==0&&strcmp(mima,b)==0)
{
printf("账户和密码输入正确,欢迎您管理员\n");
menu2(L);
break;
}
else
{
printf("您输入的账户和密码不正确\n");
break;
}
case 0://退出选项
exit(0);
break;
default:
{
printf("输入有误,请重新输入\n");
break;
}
}
}while(1);
return 0;
}
运行结果及报错内容
没有报错,但运行时候会直接停止
就是即使先在管理员界面敲一个表也会像这样
我的解答思路和尝试过的方法
是不是因为从子表返回到主菜单时已经建立的表自动删除了
我想要达到的结果
解决这个问题呗