if(A[j]==32767)break;
p=(LNode*)malloc(sizeof(LNode));
p->data=A[j];
p->next=move->next;//
move->next=p;
move=move->next;
结束
J++
Y
N
(2)Locate(LNode*head,DataTypekey)
LNode*Locate(LNode*head,DataTypekey)//建立定位查找函数Locate
{
LNode*q=head->next;
//查找并返回值为key的第1个元素的结点指针;若找不到,则返回NULL
while(q!
=head&&q->data!
=key)
q=q->next;
if(q->data==key)
returnq;
else
{
printf("查找的结点不存在!
!
\n");
returnNULL;
}
}
Y
开始
定义变量:
*q=head->next;;
结束
q!
=head&&q->data!
=key
q=q->next
q->data==key
returnq
ReturnNULlL
Y
N
N
(3)Search(LNode*head,DataType*a,DataType*b)
//求链表的最大值和次大值,分别由*a和*b带回
voidSearch(LNode*head,DataType*a,DataType*b)
{
LNode*p,*Max,*Secmax;
p=head->next->next;//*Max和*Secmax指第一个结点,*p指向第二个结点,
Max=head->next;
Secmax=head->next->next;;
while(p!
=head)
{
if(Max->data>p->data)//*Max指向最大值
{
if(p->data>Secmax->data)
Secmax=p;
}
else//*Sexmax指向次大值
{
Secmax=Max;
Max=p;
}
p=p->next;
}
*a=Max->data;//把最大和次大值分别赋值给*a和*b
*b=Secmax->data;
}
(4)Sort(LNode*head)
//查找key,把链表中比key小的作为前驱结点,比key大的作为后继结点
LNode*Sort(LNode*head)
{//*front指向key前部分链表,*rear指向key后部分链表
LNode*k,*p,*front,*rear,*L;DataTypekey;
front=head;
p=head->next;
printf("请输入key:
");
scanf("%d",&key);
L=Locate(head,key);//调用Locate()查找key
k=L;
rear=k;
while(p!
=head)
{
if(front->next!
=k)//判断key前面链表是否已经比较完毕
{
if(p->data>k->data)//将key结点前驱比key大的插到key后面
{
front->next=front->next->next;//断开结点
p->next=rear->next;//插入结点
rear->next=p;
rear=rear->next;
p=front->next;//*p指回key的前驱结点
}
else{
p=p->next;//移动指针
front=front->next;
}
}
else{
p=rear->next;
if(p->datadata)//将key结点后继比key小的插到key前面
{
rear->next=rear->next->next;//断开结点
p->next=front->next;//插入结点
front->next=p;
front=front->next;
p=rear->next;//*p指回key的后继结点
}
else{
p=p->next;//移动指针
rear=rear->next;
}
}
}
returnhead;//返回头指针
}
(5)主函数:
voidmain()//主函数
{
LNode*L,*W,*H;
DataTypea,b;
intkey,choice;//choice记载操作,key为输入值
printf("\n");
H=Create();//调用Create()建立单循环链表
//界面美化
printf("\n");
printf("***************************************************************\n");
printf("**\n");
printf("*定位查找-------------------------------------------------1*\n");
printf("*输出最大和次大值-----------------------------------------2*\n");
printf("*输出比较值key后的结果------------------------------------3*\n");
printf("*重新输入一个数组-----------------------------------------4*\n");
printf("*退出系统-------------------------------------------------0*\n");
printf("**\n");
printf("***************************************************************\n");
printf("\n");
//功能选择
printf("请选择系统功能:
");
scanf("%d",&choice);
printf("\n");
while(choice!
=0)
{
switch(choice)
{
case1:
//查找数值key并返回指针
{
printf("请输入要查找的值:
");
scanf("%d",&key);
L=Locate(H,key);
if(L!
=NULL)
printf("查找成功!
!
\n");
}
break;
case2:
//求链表的最大和次大值
{
Search(H,&a,&b);
printf("最大值:
%d\n",a);
printf("次大值:
%d\n",b);
}
break;
case3:
//将key插入链表中
{
H=Sort(H);
W=H->next;
printf("结果是:
");//输出结果
while(W!
=H)
{
printf("%d",W->data);//依次输出
W=W->next;
}
printf("\n");
}
break;
case4:
main();
default:
printf("请输入正确的选项!
!
\n");//错误处理
}
//功能重复
printf("***************************************************************\n");
printf("**\n");
printf("*定位查找-------------------------------------------------1*\n");
printf("*输出最大和次大值-----------------------------------------2*\n");
printf("*输出比较值key后的结果------------------------------------3*\n");
printf("*重新输入一个数组-----------------------------------------4*\n");
printf("*退出系统-------------------------------------------------0*\n");
printf("**\n");
printf("***************************************************************\n");
printf("请选择系统功能:
");
scanf("%d",&choice);}
}
⒋运行结果:
⒌问题与总结
(1)在编写Create()函数时,要根据一维数组A【M】建立单循环链表,一开始只是用for语句结合头结点创建单链表方法。
后来测试时发现这样无法建立有序的单循环链表,要定义一个移动指针*move总是指向链表最后一个结点。
(2)在编写Search()函数时,一开始是找出链表中最大值,然后删去这个结点,在剩下的结点中找出最大值,最后输出。
但后来测试整个程序运行时,出现每次执行Search()的功能后,别的函数就执行不了,调试之后才知道是找最大和次大值破坏了链表的完整性,导致其他函数执行不了,最后定义了两个指针来带回最大和次大值。
(3)设计Sort()函数时,为了保持结点之间的顺序时,一开始用各种方法,就是实现不了,后来看了队列的一章受到启发,定义指针front和指针rear分别控制结点key的前驱部分和后继部分,最后实现了保持顺序的功能。
(4)设计菜单,一开始选择一个功能时都要输入一个数组,后来在主函数里面调用函数Create(),解决了这个问题。
(5)健壮性处理:
设计菜单是多一个功能:
可以重新输入数组。