node* tmp=new node; tmp->data=i; tmp->next=null; head->next=tmp; head=head->next; }
head->next=p; while(p!=p->next) {
p->next->next=p->next->next->next; p=p->next->next; }
cout<
方法3:通用算法
#i nclude
#define MAXLINE 1000 //元素个数 /*
MAXLINE 元素个数
a[] 元素数组 R[] 指针场 suffix 下标
index 返回最后的下标序号 values 返回最后的下标对应的值 start 从第几个开始
K 间隔 */
int find_n(int a[],int R[],int K,int& index,int& values,int s=0) { int suffix;
int front_node,current_node; suffix=0;
if(s==0) {
current_node=0;
front_node=MAXLINE-1; }
else {
current_node=s; front_node=s-1; }
while(R[front_node]!=front_node) { printf(\ R[front_node]=R[current_node];
if(K==1) {
current_node=R[front_node]; continue; }
for(int i=0;i current_node=R[front_node]; } index=front_node; values=a[front_node]; return 0; } int main(void) { int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K; suffix=index=values=start=0; K=2; for(i=0;i R[i-1]=0; find_n(a,R,K,index,values,2); printf(\return 0; } 144、指出下列程序有什么错误: void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy( string, str1 ); } 解答:如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分; str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\\0'(字符串结束符),所以不能结束。 strcpy( char *s1,char *s2)他的工作原理是,扫描s2指向的内存,逐个字符赋到s1所指向的内存,直到碰到'\\0',因为str1结尾没有'\\0',所以具有不确定性,不知道他后面还会 赋什么东东。 正确应如下 void test2() { char string[10], str1[10]; int i; for(i=0; i<9; i++) { str1[i] = 'a'+i; //把abcdefghi赋值给字符数组 } str[i]='\\0';//加上结束符 strcpy( string, str1 ); } 145、实现strcmp int StrCmp(const char *str1, const char *str2) { assert(str1 && srt2); while(*str1 && *str1++ = = *str2++); return *str1-*str2; } 146.符串A和B,输出A和B中的最大公共子串。 比如A=\则输出\*/ //Author: azhen #i nclude #i nclude char *commanstring(char shortstring[], char longstring[]) { int i, j; char *substring=malloc(256); if(strstr(longstring, shortstring)!=NULL) //如果??,那么返回shortstring return shortstring; for(i=strlen(shortstring)-1;i>0; i--) //否则,开始循环计算 { for(j=0; j<=strlen(shortstring)-i; j++){ memcpy(substring, &shortstring[j], i); substring[i]='\\0'; if(strstr(longstring, substring)!=NULL) return substring; } } return NULL; } main() { char *str1=malloc(256); char *str2=malloc(256); char *comman=NULL; gets(str1); gets(str2); if(strlen(str1)>strlen(str2)) //将短的字符串放前面 comman=commanstring(str2, str1); else comman=commanstring(str1, str2); printf(\} 147、写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于 str2返回1,若str1小于str2返回-1 int strcmp(const char *src, const char *dst) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) { ++src; ++dst; } if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); } 148、判断一个字符串是不是回文 int IsReverseStr(char *aStr) { int i,j; int found=1; if(aStr==NULL) return -1; j=strlen(aStr); for(i=0;i if(*(aStr+i)!=*(aStr+j-i-1)) { found=0; break; } return found; 149 #include main() { int c[3][3]={1,2,3,4,5,6,7,8,9}; for(int i=0;i<3;i++) for(int j=0;j<3;j++) printf(\ printf(\printf(\printf(\printf(\ printf(\printf(\ if(int(c)==int(*c)) printf(\ } 为什么c,*c的值相等,(c+1),(*c+1)的值不等 c,*c,**c,代表什么意思? 参考答案: c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,这容易理解。**c是提领第一个元素。 为什么c,*c的值相等? int c因为直接用c表示数组c[0][0] printf(\语句已将指针移到数组头。 int(*c)表示c0的值为1,所以相等。 数组c的存放空间示意如下:(机器中是行优先存放的) c[0][0] c[0][1] c[0][2] c[1][0] c[1][1] c[1][2] c[2][0] c[2][1] c[2][2] c是一个二维数组名,实际上它是一个指针常量,不能进行自加、自减运算,即:c++、c--、++c、--c 都是不允许的; c: 数组名;是一个二维指针,它的值就是数组的首地址,也即第一行元素的首地址(等于 *c),也 等于第一行第一个元素的地址( & c[0][0]);可以说成是二维数组的行指针。 *c: 第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。 **c:二维数组中的第一个元素的值;即:c[0][0] 所以: c 和 *c的值是相等的,但他们两者不能相互赋值,(类型不同); (c + 1) :c是行指针,(c + 1)是在c的基础上加上二维数组一行的地址长度,即从&c[0][0] 变到了&c[1][0]; (*c + 1):*c是列指针,(*c + 1)是在*c的基础上加上二数组一个元素的所占的长度,即从 &c[0][0]变到了&c[0][1] 从而(c + 1)和(*c + 1)的值就不相等了 150、定义 int **a[3][4], 则变量占有的内存空间为:__32___ 参考答案: int **p; /*16位下sizeof(p)=2, 32位下sizeof(p)=4*/ 总共 3*4*sizeof(p)