运行后点第二个菜单(求表的合并和交并集)的时候没有反应
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//结点的定义
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
//初始化:建立空表
void InitLinkList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
//创建非空单链表:头部插入法
void CreateFromHead(LinkList L)
{
Node *s;
ElemType v;
int flag=1;
printf("输入表中数据,输入-100结束!\n");
while(flag)
{
scanf("%d",&v);
if(v!=-100)
{
s=(Node*)malloc(sizeof(Node));
s->data=v;
s->next=L->next;
L->next=s;
}
else {flag=0;}
}
}
//内容查找:查找单链表中元素值为e的结点,并返回该结点地址
LinkList LocateLinkElem(LinkList L,ElemType e)
{
Node*p;
p=L->next;
while(p!=NULL&&p->data!=e)p=p->next;
return p;
}
//位置查找:查找单链表中第i个元素
LinkList GetLinkElem(LinkList L,int i)
{
Node*p;
int k;
p=L->next;
k=1;
while(p!=NULL&&k<i)
{
p=p->next;
k++;
}
return p;
}
//插入:在位置i插入元素e
int InsertLinkList(LinkList L,int i,ElemType e)
{
Node*s,*pre;
int k;
pre=L;k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k++;
}
if(pre==NULL) return 0;
else
{
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=pre->next;
pre->next=s;
return 1;
}
}
//删除:删除表L中的第i个结点
int DeleteLinkList(LinkList L,int i,ElemType*e)
{
Node*s,*pre;
int k;
pre=L;k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k++;
}
if(pre==NULL) return 0;
s=pre->next;
*e=s->data;
pre->next=s->next;
free(s);
return 1;
}
//合并:合并两个有序的单链表
LinkList MergeLinkList(LinkList LA,LinkList LB,LinkList LC)
{
Node*pa,*pb,*r;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{r->next=pa;r=pa;pa=pa->next;}
else
{r->next=pb;r=pb;pb=pb->next;}
}
if(pa)
r->next=pa;
else
r->next=pb;
free(LB);
return (LC);
}
//交集
LinkList Intersection(LinkList LA,LinkList LB,LinkList LC)
{
Node*pa,*pb,*r;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data==pb->data){
r->next=pa;r=pa;pa=pa->next;
}
}
return (LC);
}
//并集
LinkList Union(LinkList LA,LinkList LB,LinkList LC)
{
Node*pa,*pb,*r;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<pb->data)
{r->next=pa;r=pa;pa=pa->next;}
else if(pa->data=pb->data)
{r->next=pb;r=pb;pb=pb->next;}
}
if(pa)
r->next=pa;
else
r->next=pb;
free(LB);
return (LC);
}
//输出单链表:输出每个结点的数据域的值
void OutPutLinkList(LinkList L)
{
Node *p;
p=L->next;//p指向首元结点
printf("L->");
while(p)//while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
void menu1()
{
system("cls");
LinkList L;//变量的定义
InitLinkList(&L);//变量的值的获取(初始值)
CreateFromHead(L); //变量的处理
OutPutLinkList(L); //变量的输出
int choice;
int i;
ElemType e;
while(1)
{
printf(" 1.插入\n");
printf(" 2.删除\n");
printf(" 3.查找\n");
printf(" 0.退出 \n");
printf(" 请选择0——3:");
scanf("%d",&choice);
if(choice==0)break;
switch(choice)
{
case 1:
printf("\n插入");
printf("输入需插入的结点位置i和插入的元素值:");
scanf("%d%d",&i,&e);
if(InsertLinkList(L,i,e))OutPutLinkList(L);
else printf("插入不成功!\n");break;
case 2:
printf("\n删除");
printf("输入被删除结点的序号i:");
scanf("%d",&i);
if(DeleteLinkList(L,i,&e)){
printf("被删除元素为%d\n",e);
OutPutLinkList(L);
}else printf("删除不成功!\n");
break;
case 3:int choice1;
system("cls");
while(1)
{
printf("31 按位置查找\n");
printf("32 按内容查找\n");
printf("0 退出\n");
printf("请选择...\n");
scanf("%d",&choice1);
if(choice1==0)break;
switch(choice1)
{
case 31:
printf("输入查找位置i:");
scanf("%d",&i);
GetLinkElem(L,i);
if(GetLinkElem(L,i)!=NULL)printf("该位置元素为%d\n");
else printf("该位置没有元素!\n");break;
case 32:
printf("\n查找");
printf("输入要查找的元素值:");
scanf("%d",&e);
LocateLinkElem(L,e);
if(LocateLinkElem(L,e)==0)printf("查找失败!\n");
else printf("查找成功,该元素是表中第%d个元素",e);
break;
default:printf("选择错误,请重新选择!\n"); break;
}
getch();
system("cls");
}
break;
default:printf("选择错误!请重新选择!\n");
}
getch();
system("cls");
}
getch();
}
void menu2()
{
system("cls");
LinkList LA,LB,LC;//变量的定义
int choice;
int i;
ElemType e;
InitLinkList(&LA);
InitLinkList(&LB);
printf("输入表LA数据:\n") ;
CreateFromHead(LA);
printf("输入表LB数据:\n") ;
CreateFromHead(LB);
printf("LA: ");
OutPutLinkList(LA);
printf("LB: ");
OutPutLinkList(LB);
while(1)
{
printf("1 两个有序表的合并\n");
printf("2 两个集合的交\n");
printf("3 两个集合的并\n");
printf("0 退出\n");
printf("请选择......\n");
scanf("%d",&choice) ;
if(choice==0 )break;
switch(choice)
{
case 1: MergeLinkList(LA,LB,LC);printf("合并后的表LC: ");OutPutLinkList(LC);break;
case 2: Intersection(LA,LB,LC);OutPutLinkList(LC);break;
case 3: Union(LA,LB,LC);OutPutLinkList(LC);break;
default:printf("选择错误,请重新选择!\n");break;
}
getch();
system("cls");
}
}
void menu()
{
int choice;
while(1)
{
printf("1 一个表的运算\n");
printf("2 两个表的运算\n");
printf("0 退出\n");
printf("请选择......");
scanf("%d",&choice);
if(choice==0) break;
switch(choice)
{
case 1: menu1();break;
case 2: menu2();break;
default:printf("选择错误!请重新选择。\n");
}
getchar();
system("cls");
}
}
int main()
{
menu();
}
```c++
```