这是某公司的笔试题,各位看看是否能给出标准答案来!原题如下:
1. 操作符重载 (10分)
   class CStaff:pulic CObject
  {
    Public:
       CStaff();
       CStaff &operator=(const CStaff &staffSrc);
     private:
       CString n_name;
       Int m_Salary:
   };
  请重载此类赋值操作符。2.链表
  Struct LinkedList
  {
    int value;
    LinkedList *pHead;
  }
  Struct LinkedList *pHead;
  请编写删除链表的头、尾和中间的第n个节点的程序。(13分)3.编写一个算法,用来访问所有二叉排序树的节点。(15分)

解决方案 »

  1.   

    第一個CStaff& CStaff::operator =(const CStaff &staffSrc)
    {
    if (&staffSrc != this)
    {
    n_name = staffSrc.n_name;
    m_Salary = staffSrc.m_Salary;
    } return *this;
    }
      

  2.   

    第二個// delete node from head:
    // Note: if success, return TRUE, or will return FALSEBOOL DeleteNode(int nNode, lpLinkList pHead)
    {
    ASSERT (pHead != NULL); if (1 == nNode) // head node
    {
    delete pHead;
    return TRUE;
    } lpLinkList pWrk = pHead;
    lpLinkList pPre;
    for (int i = 1; i < nNode; i++)
    {
    pPre = pWrk;
    pWrk = pHead->pHead;
    if (NULL == pWrk) // cannot find this node
    {
    return FALSE;
    }
    } pPre->pHead = pWrk->pHead;
    delete pWrk; return TRUE;
    }
      

  3.   

    第三個typedef struct TreeNode
    {
    int Data;
    TreeNode *Left;
    TreeNode *Right;
    }*lpTreeNode;// 中序遍歷二叉樹
    // Print all date
    void MidTravl(lpTreeNode pRoot)
    {
    ASSERT (pRoot != NULL); if (pRoot->Left != NULL)
    {
    MidTravl(pRoot->Left);
    } printf("Data = %d", pRoot->Data); if (pRoot->Right != NULL)
    {
    MidTravl(pRoot->Right);
    }
    }
      

  4.   

    累,花了我20分鐘想做好程序員,卻忽視基本功,是不可能成功的這些東西很基本,也不難,但是卻能看出一個人的學習能力和態度. longki(代码狂人),你不合格!
      

  5.   

    哦, fzd999(花差花差)好厉害! 佩服、佩服,一看就是牛人!你给的这些答案应该标准的吧?还有没有需要改动的地方?
      

  6.   

    还有一个判断题。
    它们问 
        int &a; 这样定义对不对?还有:
        short x=32700;
        short y=367;
        short z;
       求z=x+y等于多少?
    我认为,对于32位机来说,short范围是-32768~32767,上面的家法出现溢出现象,大出300,在汇编中好像专门有溢出的处理方式,不过记得不清楚了。
      

  7.   

    heh ~~  不是很难 但是会需要一些时间来考虑!
      

  8.   

    to fzd999(花差花差) :
    关于你的第二个代码,我有一点不太明白,在for循环中的:
    pPre = pWrk;
    pWrk = pHead->pHead;(这一句不太明白,我想是不是应该改成"pWrk = pPre->pHead;",请指点)另外,请不要随便评论别人合不合格!
      

  9.   

    我觉得这种题目是在学校里考试学生的!或是刚毕业没多久的就做的很溜!工作多年的大有可能是做不出这种题目了!
    当然也应该说前几年的科班毕业的基础是比不过现在的别的专业在校学生了!
    2000,1999年前大多的大学还没开C++,(甚至c呢),大多是教Pascal!现在又得自学!
    再过两年大家又都一样(。net....)
    这是IT的幸或不幸呢?论事不论人吧!
      

  10.   

    呵呵,
    老了,只能活到老,学到老了!
    羡慕现在的在校学生啊!有人教C++,VC,MFC,JAVA...还有Internet,宽带,廉价PC 
    当年资源匮乏,就一本 谭浩强 的C ,睁着抢着买呢!
    上千万的销售记录恐怕再也不会有后来者了吧!
      

  11.   

    既然 BOOL DeleteNode(int nNode, lpLinkList pHead)是个函数,lpLinkList 是一个结构体,传入的参数是pHead(类型是lpLinkList),那么在函数的内容又怎么会出现lpLinkList呢?以他来定义变量?
             ?  lpLinkList pWrk = pHead;
    ?  lpLinkList pPre;

    请指教。
      

  12.   

    第二个,我觉得是不是这样
    if (1 == nNode) // head node
    {
    lpLinkList pWrk = pHead;
    pHead = pWrk->pHead;
    delete pWrk;
    return TRUE;
    }
      

  13.   

    当删除头节点的时候是比较麻烦楼上的朋友,你认为那个 pHead = pWrk->pHead; 语句会有效吗?请做个试验先:)
      

  14.   

    第二题:
    struct LinkedList *del(Struct LinkedList *pHead,int num)
    {
      Struct LinkedList *p1,*p2;
      if(pHead==NULL)
      {
         printf("List null!\n");
         return(pHead);
       }
       p1=pHead;
      
       if(num==1&&p1->pNext!=NULL)
       {
          pHead=p1->pNext;
          return(pHead);
        }
     
        for(int i=1;i<num;i++)
        {
          p2=p1;
          p1=p1->pNext;
          if(p1=NULL)
          {
             printf("Not find the node\n");
             return(pHead);
           }
         }
        p2->pNext=p1->pNext;
        return(pHead);
    }  如有不足之处请指教!
      

  15.   

    发送者 fzd999 发送时间 2004-1-6 11:17:17 删除  回复  
      你好, 看到你的代码了,你是北京的硕士吧?  说实话,我不认为你应该在这些基础的东西上花费事件,而应该把精力放在应用领域,去解决那些有深度有难度的东西。这些大学本科生的东西,对你来说太小儿科了。  假如你想做程序员,那就应该学学如何写出风格良好的代码。简单的说,你的代码虽然能完成功能,但是有经验的程序员一眼就能看出你的代码用到产品中会造成大量的隐患。  建议你看看编码规范之类的书籍,然后再重新看看你的代码有哪些缺陷。  我写的代码是10分钟产物,没有仔细考虑过,谢谢你的提醒。 上面是fzd999发给我的留言。首先,非常感谢你的指点。作程序员,搞编程的都很辛苦,而且这方面的知识增长与经验和工作时间长短有很大关系,但是,这也是一种“青春饭”的行业,我们也要想想以后的路。不过,不管怎么说,程序写的好又快的确实让人佩服。有时间大家相互学习,QQ:149328838
      

  16.   

    疑问:第一题:私有private变量似乎不能读取吧?如何重载???
      

  17.   

    我觉得该这样
    增加两个public函数
    get_n_name;get_m_Salary;
      

  18.   

    journay建议你做一下试验 :)
      

  19.   

    可是原理上说不过去啊,fzd999(花差花差) 解释一下如何?
      

  20.   

    记得原来看过一个人的文章,大概是说中国的程序员和印度程序员的对比的,具体内容记不得了,但有一点我却记得很清楚就是:
    中国的程序员看到印度的程序员写的代码,都回认为很笨,用一个词形容就是"又臭又长",但人家的程序却很健壮。中国的程序员总是追求短小精悍,使用优美的算法等。但中国的程序员写的程序却没有人家的健壮。作者在和一个印度的程序员交流的时候当问到这个问题的时候得到的回答,我们没有必要考虑,现在的计算机CPU都上GHz的速度了,内存都512MB,少的也有128MB了,我们考虑的是程序在能完成设计要求的功能的情况下尽可能的健壮。
    各位朋友,我觉得我们是不是都走入了一个误区!!!!我们总是在比谁的程序算法好,谁的技术是别人不会的,于是就出现了有人用VC写了若干个加密算法就拿出来卖钱。有必要吗?我最讨厌的就是在应聘的时候面试的人员考你算法,什么链表,什么二叉树的遍历,我敢说,让这些人使用他们最熟悉的语言写一个对树控件任意增删数据的一个过程,他们未必就能完成!
    基础知识固然重要,但并不是掌握了基础知识就真正的掌握了编程技巧。纸上谈兵在任何时候都不会被推崇的!!!
    我是就事论事,如果冒犯了那个大哥,还望能原谅!!
      

  21.   

    楼上,“术业有专攻”这句话你听说过吗?  印度软件做的主要是大型软件的外包,他们的程序运行环境一般很好,所以不需要考虑效率问题。可是,如果你用同样的办法来写WindowsCE的程序,那还得了?
      印度的程序员叫Coder,高中生就能做,只要完成功能就行,根本不需要也不会考虑更多。而我们中国呢?程序员叫Programmer,软件类型也五花八门,按你说的,咱们的民族软件也就别发展,跟着印度人做外包去好了。  顺便说一下,如果你想学对树控件任意增删数据的过程,我倒是可以写给你一个风格良好效率很高而且算法思路明晰的代码。
      

  22.   

    To journay重载运算符的函数是类的成员函数,它当然能访问自己所在的类的私有成员变量
      

  23.   

    #define SUCCESSED 1
    #define EMPTYLIST 0
    #define FAILED -1
    //删除链表中的第n个节点(包括头节点和尾节点)
    //若删除成功则返回1,空表返回0,没找到返回 -1
    int DeleteNode(int n)
    {
    if( pHead == NULL) //空表
    return EMPTYLIST; struct LinkedList *pcur,*pre;
    long i=1; pcur=pre=pHead; while(pcur->pHead != NULL) //查找节点指针
    {
    if(i == n)
    {
    break;
    }

    i++;
    pre = pcur;
    pcur = pcur->pHead;
    } if(i != n)
    {
    return FAILED; //没找到
    } if(i == 1) //表头
    {
    pHead = pcur->pHead;
    }
    else
    {
    pre->pHead = pcur->pHead;
    }

    delete pcur; return SUCCESSED;
    }//删除链表的头节点
    //若删除成功则返回1,空表返回0int DeleteHead()
    {
    if(pHead == NULL)
    return EMPTYLIST; struct LinkList *p;
    p = pHead; pHead = p->pHead;

    delete p; return SUCCESSED;
    }//删除链表的尾节点
    //若删除成功则返回1,空表返回0
    int DeleteTail()
    {
    if(pHead == NULL)
    return EMPTYLIST; struct LinkList *p;
    p = pHead;

    if(p->pHead == NULL) //只有一个节点的情况
    {
    delete p;
    pHead == NULL;
    return SUCCESSED;
    } for(;p->pHead->pHead != NULL;p = p->pHead) ; delete p->pHead; p->Head = NULL; return SUCCESSED;
    }
      

  24.   


    不知道,是不是我就不行了。不是到bill写不写得出来
      

  25.   

    zzutligang(小鸟) :别看了几片文章就在这里大放XX。对链表、栈还有树这些的操作是一个程序员的基本要求。