一道PASCAL语言题!

[复制链接]
查看11 | 回复1 | 2006-2-5 14:37:24 | 显示全部楼层 |阅读模式
PASCAL的我忘了语法了...用C++的行不行呀...下面,我主要用程序来说明算法....(会用到一些比较另类的技巧,请楼主好好想想,对以后会有所帮助的)假设: 两个数组分别为A和B.其中,逻辑上两数组都是与十六进制数FFFFFFFF为结束符...合并后的链表逻辑上用NULL为结束符. 则C++的编程如下...struct Mlink //定义链表结构{ int data; Mlink *next;}Mlink *ML(int *A; int *B) { Mlink *lp,*head; //lp用来指向最后一个待添加数据的指针. head用来存放头指针 int i,j; //被大循环用的AB数组下标... int n,max,*pab; //为简化源代码而特意定义的,请仔细思考下面的循环体.其中,max代表比较中的最大值,pab指向那组比max小的数组首地址,n专为互换i,j数组下标而设下的lp=new Mlink; head=lp;//初始化链表...也就是产生第一项并在赋给head保存for (i=0,j=0;(A!=0xFFFFFFFF)&&(B[j]!=0xFFFFFFFF);)
//遍历A和B的所有数据,直到有其中一组碰到结束符为止...//PS:下面的循环体逻辑比较复杂,我不知怎么说清楚,楼主仔细想想吧...:)//注,这个循环用到了一个灵活使有变量的技巧..//建议楼主好好分析...会对你以后有很大的帮助的...{
if (A>B[j]) {pab=B[0]; max=A; n=j;}
else {pab=A[0]; max=B[j]; n=i;}
//这个条件是关键,目的是使得下面的一个小循环得以统一执行...
lp->data=max;
lp->next=new Mlink;
lp=lp->next;
for (; (pab[n]data=pab[n];
lp->next=new Mlink;
lp=lp->next;
}
if (pab[n]!=0xFFFFFFFF) break; //发现有数组终止,强制跳出该循环...//-----------------------------------
if (A>B[j]) {j=n; i++;}
else {i=n; j++;}//这个条件的作用相当于把前面统一的结果分解出来,以便大循环体能正常工作...}//下面又是一个特意通过pab指针的简化代码的方法,这逻辑比较简单....int *pab;
if (A==0xFFFFFFFF) pab=&B;
else pab=&A;for (; pab!=0xFFFFFFFF; i++)
{
lp->data=pab;
lp->next=new Mlink;
}delete lp->next;lp->next=NULL;return(head);}PS:PASCAL我是很久以前学的,关键词几乎都忘了,不好意思! 以上的程序使用的技巧,希望楼主能多想想...肯定会对你以后有作用的...:)~欢迎播旗~(嘿嘿)
回复

使用道具 举报

千问 | 2006-2-5 14:37:24 | 显示全部楼层
算法名称:归并排序具体忘了。。。可以在oibh的论坛上查一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行