C++引用符号(&)疑问
#include<stdio.h>#include<stdlib.h>
#define SIZE 20
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
int flag1=1,flag2=1;
Status InitList(SqList &L,int size);
Status GetElem(SqList L,int i,ElemType &e);
void PriorElem(SqList LA,SqList LB);
void Prior_LElem(SqList L,int Flag);
void NextElem(SqList LA,SqList LB);
void Next_LElem(SqList L,int Flag);
void ListInsert(SqList &LA,SqList &LB);
void ListInsert_L(SqList &L,int Flag);
void ListDelete(SqList &LA,SqList &LB);
void Delete_LElem(SqList &L,int Flag);
void ClearList(SqList &LA,SqList &LB);
void DestoryList(SqList &LA,SqList &LB,SqList &LC);
void MergeList(SqList LA,SqList LB,SqList &LC);
void Output(SqList LA,SqList LB,SqList LC);
void output_L(SqList L);
void main()
{
int a=1;
SqList LA,LB,LC;
InitList(LA,SIZE);
InitList(LB,SIZE);
InitList(LC,2*SIZE);
ListInsert_L(LA,flag1);
ListInsert_L(LB,flag2);
system("cls");
while(a)
{
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输 出 前 驱\n\n");
printf("\t\t\t2——输 出 后 继\n\n");
printf("\t\t\t3——插 入 元 素\n\n");
printf("\t\t\t4——删 除 元 素\n\n");
printf("\t\t\t5——置 空 线 性 表\n\n");
printf("\t\t\t6——销 毁 线 性 表\n\n");
printf("\t\t\t7——合 并 线 性 表\n\n");
printf("\t\t\t8——输 出 线 性 表\n\n");
printf("\t\t\t0——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
PriorElem(LA,LB);
system("cls");
break;
case 2:
system("cls");
NextElem(LA,LB);
system("cls");
break;
case 3:
system("cls");
ListInsert(LA,LB);
system("cls");
break;
case 4:
system("cls");
ListDelete(LA,LB);
system("cls");
break;
case 5:
system("cls");
ClearList(LA,LB);
system("cls");
break;
case 6:
system("cls");
DestoryList(LA,LB,LC);
system("cls");
break;
case 7:
system("cls");
MergeList(LA,LB,LC);
system("cls");
break;
case 8:
system("cls");
Output(LA,LB,LC);
system("cls");
break;
case 0:
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t\t 谢谢使用\n\n\n\n\n\n\n\n\n\n\n\n");
break;
}
}
}
Status InitList(SqList &L,int size)
{
L.elem=(ElemType *)malloc(size*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=size;
return OK;
}
Status GetElem(SqList L,int i,ElemType &e)
{
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
}
void PriorElem(SqList LA,SqList LB)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输出LA中元素的前驱\n\n");
printf("\t\t\t2——输出LB中元素的前驱\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
Prior_LElem(LA,flag1);
system("cls");
break;
case 2:
system("cls");
Prior_LElem(LB,flag2);
system("cls");
break;
case 3:
system("cls");
break;
}
}
void Prior_LElem(SqList L,int Flag)
{
int a,e,i,flag=0;
if(L.length==0)
printf("线性表已被置空");
else if(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入输出前驱的元素:");
G: scanf("%d",&a);
for(i=1;i<=L.length;i++)
{
GetElem(L,i,e);
if(a==e)
{
flag=1;
if(i==1)
{
printf("\n\n元素%d没有前驱",a);
break;
}
GetElem(L,i-1,e);
printf("\n\n元素%d的前驱是:%d",a,e);
}
}
if(flag==0)
{
printf("\n\n你输的数据不在线性表中,请重新输入:");
goto G;
}
}
printf("\n\n\n\n\n\n按Enter键→");
getchar();getchar();
}
void NextElem(SqList LA,SqList LB)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输 出 LA 中 元 素 的 后 继\n\n");
printf("\t\t\t2——输 出 LB 中 元 素 的 后 继\n\n");
printf("\t\t\t3——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
Next_LElem(LA,flag1);
system("cls");
break;
case 2:
system("cls");
Next_LElem(LB,flag2);
system("cls");
break;
case 3:
system("cls");
break;
}
}
void Next_LElem(SqList L,int Flag)
{
int a,e,i,flag=0;
if(L.length==0)
printf("线性表已被置空");
else if(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入输出后继的元素:");
I: scanf("%d",&a);
for(i=1;i<=L.length;i++)
{
GetElem(L,i,e);
if(a==e)
{
flag=1;
if(i==L.length)
{
printf("\n\n元素%d没有后继",a);
break;
}
GetElem(L,i+1,e);
printf("\n\n元素%d的后继是:%d",a,e);
}
}
if(flag==0)
{
printf("\n\n你输的数据不在线性表中,请重新输入:");
goto I;
}
}
printf("\n\n\n\n\n\n按Enter键→");
getchar();getchar();
}
void ListInsert(SqList &LA,SqList &LB)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——在 LA 中 插 入 元 素\n\n");
printf("\t\t\t2——在 LB 中 插 入 元 素\n\n");
printf("\t\t\t3——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
ListInsert_L(LA,flag1);
system("cls");
break;
case 2:
system("cls");
ListInsert_L(LB,flag2);
system("cls");
break;
case 3:
system("cls");
break;
}
}
void ListInsert_L(SqList &L,int Flag)
{
int a,b,i,*p,*q;
if(Flag==0)
printf("线性表已被销毁");
else
{
if(L.length==0)
{
printf("请在线性表中输入数据,输入0结束(0不作为线性表中的数据)\n");
for(i=0;i<SIZE;i++)
{
scanf("%d",&L.elem[i]);
if(L.elem[i]==0)
break;
L.length++;
}
}
else if(L.length>0&&L.length<SIZE)
{
printf("请输入要插入的数据:");
A: scanf("%d",&a);
for(i=0;i<L.length;i++)
{
if(a==L.elem[i])
{
printf("\n数据%d已存在线性表中,请重新输入:",a);
goto A;
}
}
printf("\n请输入要插入的位置:(1~%d)",L.length);
B: scanf("%d",&b);
if(b>L.length||b<1)
{
printf("\n\n你输入的位置有误\n请重新输入:");
goto B;
}
q=&(L.elem[b-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=a;
++L.length;
printf("\n数据%d已插入到线性表中",a);
}
else
printf("线性表已存满");
}
}
void ListDelete(SqList &LA,SqList &LB)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——删 除 LA 中 的 元 素\n\n");
printf("\t\t\t2——删 除 LB 中 的元 素\n\n");
printf("\t\t\t3——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
Delete_LElem(LA,flag1);
system("cls");
break;
case 2:
system("cls");
Delete_LElem(LB,flag2);
system("cls");
break;
case 3:
system("cls");
break;
}
}
void Delete_LElem(SqList &L,int Flag)
{
int a,*p,*q,flag=0,i;
if(L.length==0)
printf("线性表已被置空");
else if(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入要删除的数据:");
E: scanf("%d",&a);
for(i=0;i<L.length;i++)
{
if(a==L.elem[i])
{
flag=1;
break;
}
}
if(flag==0)
{
printf("\n数据%d不在线性表中,请重新输入:",a);
goto E;
}
p=&(L.elem[i]);
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
printf("第%d个元素%d已被删除\n",i+1,a);
printf("\n\n\n按Enter键→");
getchar();getchar();
}
}
void ClearList(SqList &LA,SqList &LB)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——将 LA 置 为 空 表\n\n");
printf("\t\t\t2——将 LB 置 为 空 表\n\n");
printf("\t\t\t3——将 LA 和 LB 置 为 空 表\n\n");
printf("\t\t\t4——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
LA.length=0;
printf("已将LA表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 2:
system("cls");
LB.length=0;
printf("已将LB表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 3:
system("cls");
LA.length=0;
LB.length=0;
printf("已将LA和LB表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 4:
system("cls");
break;
}
}
void DestoryList(SqList &LA,SqList &LB,SqList &LC)
{
int a;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——删 除 LA 表\n\n");
printf("\t\t\t2——删 除 LB 表\n\n");
printf("\t\t\t3——删 除 LA 和 LB 表\n\n");
printf("\t\t\t4——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
free(LA.elem);
flag1=0;
printf("已删除LA表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 2:
system("cls");
free(LB.elem);
flag2=0;
printf("已删除LB表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 3:
system("cls");
free(LA.elem);
flag1=0;
free(LB.elem);
flag2=0;
printf("已删除LA和LB表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 4:
system("cls");
break;
}
}
void MergeList(SqList LA,SqList LB,SqList &LC)
{
int *pa,*pb,*pc,*pa_last,*pb_last;
pa=LA.elem;
pb=LB.elem;
pc=LC.elem;
pa_last=LA.elem+LA.length-1;
pb_last=LB.elem+LB.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<*pb)
{
*pc++=*pa++;
LC.length++;
}
else if(*pa=*pb)
{
*pc++=*pa++;
pb++;
LC.length++;
}
else
{
*pc++=*pb++;
LC.length++;
}
}
while(pa<=pa_last)
{
*pc++=*pa++;
LC.length++;
}
while(pb<=pb_last)
{
*pc++=*pb++;
LC.length++;
}
printf("已将LA和LB合并到LC中");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
}
void Output(SqList LA,SqList LB,SqList LC)
{
int a,b,c,d,i;
printf("\n\n");
printf("\t\t\t 主 菜 单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输 出 LA 表\n\n");
printf("\t\t\t2——输 出 LB 表\n\n");
printf("\t\t\t3——输 出 LC 表\n\n");
printf("\t\t\t4——输 出 LA、LB 和 LC 表\n\n");
printf("\t\t\t5——退 出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
if(LA.length==0)
printf("线性表LA已被置空");
else if(flag1==0)
printf("线性表LA已被销毁");
else
{
printf("\n\n\t\t\t\t主 菜 单\n\n");
printf("\t\t -------------------------------------\n\n");
printf("\t\t\t1——将 线 性 表 LA 按 原 样 输 出\n\n");
printf("\t\t\t2——将 线 性 表 LA 按 顺 序 输 出\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&b);
switch(b)
{
case 1:
system("cls");
printf("线性表LA中的元素:");
for(i=0;i<LA.length;i++)
printf("%d ",LA.elem[i]);
break;
case 2:
system("cls");
output_L(LA);
break;
case 3:
system("cls");
break;
}
}
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 2:
system("cls");
if(LB.length==0)
printf("线性表LB已被置空");
else if(flag2==0)
printf("线性表LB已被销毁");
else
{
printf("\n\n\t\t\t\t主 菜 单\n\n");
printf("\t\t -------------------------------------\n\n");
printf("\t\t\t1——将 线 性 表 LB 按 原 样 输 出\n\n");
printf("\t\t\t2——将 线 性 表 LB 按 顺 序 输 出\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&c);
switch(c)
{
case 1:
system("cls");
printf("线性表LB中的元素:");
for(i=0;i<LB.length;i++)
printf("%d ",LB.elem[i]);
break;
case 2:
system("cls");
output_L(LB);
break;
case 3:
system("cls");
break;
}
}
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 3:
system("cls");
if(LC.length==0)
printf("线性表LC未存入数据");
else
{
printf("\n\n\t\t\t\t主 菜 单\n\n");
printf("\t\t -------------------------------------\n\n");
printf("\t\t\t1——将 线 性 表 LC 按 原 样 输 出\n\n");
printf("\t\t\t2——将 线 性 表 LC 按 顺 序 输 出\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&d);
switch(d)
{
case 1:
system("cls");
printf("线性表LC中的元素:");
for(i=0;i<LC.length;i++)
printf("%d ",LC.elem[i]);
break;
case 2:
system("cls");
output_L(LC);
break;
case 3:
system("cls");
break;
}
}
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 4:
system("cls");
if(LA.length==0)
printf("线性表LA已被置空\n\n");
else if(flag1==0)
printf("线性表LA已被销毁\n\n");
else
{
printf("线性表LA中的元素:");
for(i=0;i<LA.length;i++)
printf("%d ",LA.elem[i]);
}
if(LB.length==0)
printf("\n\n线性表LB已被置空\n\n");
else if(flag2==0)
printf("\n\n线性表LB已被销毁\n\n");
else
{
printf("\n\n线性表LB中的元素:");
for(i=0;i<LB.length;i++)
printf("%d ",LB.elem[i]);
}
if(LC.length==0)
printf("\n\n线性表LC未存入数据");
else
{
printf("\n\n线性表LC中的元素:");
for(i=0;i<LC.length;i++)
printf("%d ",LC.elem[i]);
}
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case 5:
system("cls");
break;
}
}
void output_L(SqList L)
{
int a,i,j,k;
printf("线性表元素从小到大的顺序排列为:");
for(i=0;i<L.length-1;i++)
{
k=i;
for(j=k;j<L.length;j++)
if(L.elem[k]>L.elem[j])
k=j;
a=L.elem[k];L.elem[k]=L.elem[i];L.elem[i]=a;
}
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n\n线性表元素从大到小的顺序排列为:");
for(i=0;i<L.length-1;i++)
{
k=i;
for(j=k;j<L.length;j++)
if(L.elem[k]<L.elem[j])
k=j;
a=L.elem[k];L.elem[k]=L.elem[i];L.elem[i]=a;
}
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
}
我在C++里运行此程序时,没有出现错误,但问题在于输出函数,每次将线性表LA或LB选择按顺序输出后,再次将LA或LB按原样输出时就会出现问题。输出的结果是排序后的顺序,并非是原样输入时的顺序。但输出函数的形参里并没有使用&(引用)符号,线性表LA和LB不应该会发生变化(LA和LB应是原样输入时的顺序),对此感到很疑惑。非常感谢帮助我修改好程序!