1、1.实现双向链表删除一个节点 P,在节点 P 后插入一个节点,写出这两个函数;答:/假设线性表的双向链表存储结构typedef struct DulNodestruct DulNode *prior; /前驱指针ElemType data; /数据struct DulNode *next; /后继指针DulNode,*DuLinkList;/删除操作Status ListDelete_DuL(DuLinkList e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);return OK;/插入操作Status ListInsert_D
2、uL(DuLinkList if(!(s=(DuLinkList)malloc(sizeof(DuLNode)return ERROR;s-data=e;s-prior=p-prior;p-prior-next=s;s-next=p;p-prior=s;return OK;2.写一个函数,将其中的t 都转换成4个空格。答:该函数命名为 convert,参数的意义为:*strDest 目的字符串 ,*strSrc 源字符串,length 源字符串的长度函数实现为:char* convert(char *strDest, const char *strSrc,int length)char * c
3、p = strDest;int i=0;while(*strSrc j= EPSINON) = (a) + (b) * 3 其实是想要(a + b) * 3所以,一般的规则是:宏里面参数全部用括号括起来;如果作为值返回,整个表达式也用括号括起来。所以,上面最好这么写:#define MULTI(a,b) (a) * (b)#define ADD(a,b) (a) + (b)2、实际使用参数和宏内部变量同名#define HASH(str,sz,rst) dounsigned int n = 0; n = xxx; rst = n % sz;while(0)这是一个 hash 的宏实现,其中定义
4、了一个临时变量 n,根据 str 计算 n,然后对 sz 求模并把返回值赋给传进来的 rst.这么调用:int n;HASH(“hello”,7,n);不会达到改变 n 的效果,因为实际使用参数 n 和宏内部的变量 n 同名。宏扩展中最后一条语句是:n = n % sz;因为宏内部 n 有更小作 用域,实际赋值的是宏内部的那个临时变量 n。外面调用的 n 不会有任何改变。这个副作用有些隐蔽,一般的规则是:宏内部变量使用一种不同风格的命名方式。比如:#define HASH(str,sz,rst) dounsigned int _n = 0; _n = 3、+,#define MAX(a,b)
5、(a) (b) ? (a) : (b)int a = 3,b = 2;int c = MAX(a+,b);执行看看,不但 a 的值不是和想要的一致,返回值 c 也会让你大吃一惊,哈哈。 (a = 5,c = 4)在宏内部一个变量”执行” 多少次,它就自增或自减了多少次。所以一般使用宏最好不要传入自增自减。如果你一定要在宏里消除这个副作用,可以这样:#define MAX(a,b) (int _x = (a), _y = (b);(_x _y) ? _x : _y;)也就是:保证传入宏的参数在内部只使用一次。(注意:传入 a+或+a 都能得到各自正确的效果)这里的内部变量_x,_y 是不需要用括
6、号包起来的,原因可以自己想想。另外对宏中括号的使用补充说明两点:因为宏中定义了临时变量,所以要用括起来;因为要返回值,所以外面还要用()括起来(不返回值);另外,这里还有一个问题:实际中 a,b 不一定是 int 的,这个宏中的临时变量声明为 int,不通用。改进:#define MAX(a,b,type) (type _x = (a), _y = (b);(_x _y) ? _x : _y;)使用:MAX(1,2,int); MAX(1.1,1.2,double);是不是感觉怪怪的,有点 c+的感觉 这样的使用太复杂了,而且也会给代码的阅读带来难度。我觉得好的态度是多了解些宏的可能的副作用,
7、在实际编码中遵守第1、2 条规则,不要往宏中传入自增自减的东西,就够了。不要把过多的复杂度全扔给宏, ”通用 ”也不能盲目,因为毕竟:yy 是没有极限的。试题4:为什么标准头文件都有类似以下的结构?Code#ifndef _INCvxWorksh#define _INCvxWorksh#ifdef _cplusplusextern “C” #endif/*/#ifdef _cplusplus#endif#endif /* _INCvxWorksh */解答:头文件中的编译宏#ifndef _INCvxWorksh#define _INCvxWorksh#endif的作用是防止被重复引用。作为一
8、种面向对象的语言,C+支持函数重载,而过程式语言 C 则不支持。函数被 C+编译后在symbol 库中的名字与 C 语言的不同。例如,假设某个函数的原型为:void foo(int x, int y);该函数被 C 编译器编译后在 symbol 库中的名字为_foo,而 C+编译器则会产生像_foo_int_int 之类的名字。_foo_int_int 这样的名字包含了函数名和函数参数数量及类型信息,C+就是考这种机制来实现函数重载的。为了实现 C 和 C+的混合编程,C+提供了 C 连接交换指定符号 extern “C”来解决名字匹配问题,函数声明前加上 extern “C”后,则编译器就会
9、按照 C 语言的方式将该函数编译为_foo,这样 C 语言中就可以调用 C+的函数了。试题5:编写一个函数,作用是把一个 char 组成的字符串循环右移 n 个。比如原来是“abcdefghi”如果 n=2,移位后应该是“hiabcdefgh ”函数头是这样的:/pStr 是指向以0 结尾的字符串的指针/steps 是要求移动的 nvoid LoopMove ( char * pStr, int steps )/请填充解答:正确解答1:Codevoid LoopMove ( char *pStr, int steps )int n = strlen( pStr ) steps;char tmp
10、MAX_LEN;strcpy ( tmp, pStr + n );strcpy ( tmp + steps, pStr);*( tmp + strlen ( pStr ) ) = 0;strcpy( pStr, tmp );正确解答2:Codevoid LoopMove ( char *pStr, int steps )int n = strlen( pStr ) steps;char tmpMAX_LEN;memcpy( tmp, pStr + n, steps );memcpy(pStr + steps, pStr, n );memcpy(pStr, tmp, steps );剖析:这个试
11、题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memsetmemcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由 src 所指内存区域复制 count 个字节到 dest 所指内存区域。说明:src 和 dest 所指内存区域不能重叠,函数返回指向 dest 的指针。注意:与 strcpy 相比,memcpy 并不是遇到0就结束,而是一定会拷贝完 n
12、 个字节。举例:/ memcpy.c#include #include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;clrscr();memcpy(d,s,strlen(s);dstrlen(s)=0;printf(“%s”,d);getchar();return 0;截取 view#include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;memcpy(d,s+14,4);/memcpy(d,s+14*siz
13、eof(char),4*sizeof(char);也可d4= 0;printf(“%s”,d);getchar();return 0;输出结果:View初始化数组char msg10;memcpy(msg,0,sizeof(msg);memset函数原型void *memset(void *s, int ch, unsigned n);编辑本段程序例#include #include #include memset 函数int main(void)char buffer = “Hello worldn”;printf(“Buffer before memset: %sn”, buffer);m
14、emset(buffer, *, strlen(buffer) );printf(“Buffer after memset: %sn”, buffer);return 0;输出结果:Buffer before memset: Hello worldBuffer after memset: *编译平台:Microsoft Visual C+ 6.0也不一定就是把内容全部设置为 ch 指定的 ASCII 值,而且该处的 ch 可为 int 或者其他类型,并不一定要是 char 类型。例如下面这样:int array5 = 1,4,3,5,2;for(int i = 0; i 0.000001uns
15、igned int const size2 = temp;char str2 size2 ;答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。7. 以下反向遍历 array 数组的方法有什么错误?vector array;array.push_back( 1 );array.push_back( 2 );array.push_back( 3 );for( vector:size_type i=array.size()-1; i=0; i ) / 反向遍历 array 数组cout psrc i!=-1; i )pdesti = psrci;elsefor( size_t i=0; ipdesti = psrci;return dest;