补充之前中兴校招面试的问题(软件开发岗位)
补充一下之前中兴面试的时候的几个问题,再不不上来就要忘光了: 1、静态变量和全局变量的区别是什么? (待我有了充分理解之后补充) 2、写一个在单链表尾部插入一个节点的函数。 这个题目面试的时候写完了觉得自己很自信,觉得写的很好,现在回忆到的现场写的程序大概是下面这样的。但是其实千疮百孔。
void insert_at_end(struct node* head,struct node* toInsert) { struct node * p; p = head; while(NULL != p->next) { p = p->next; } p->next = toInsrt; }
-
首先,正常在尾部插入节点的函数,应该是不会传递节点进去的,应该是只会把待插入的值告诉你,所以正常的函数声明应该是这样的void insert_at_end(struct node * head,int val)(假设插入一个整型值),而不是上面的void insert_at_end(struct node * head,struct node * dot) 依照上面的这个安排,那么我们在进入函数找到位置之后,其实还应该要动态申请一个节点内存struct node * new_dot = (struct noede *)malloc(sizeof(struct node)); 然后,插入完成之后,要想想,为什么我能够找到链表的尾部,是因为我们通过判断尾部节点的指针是空的。那么我们插入完成一个节点完事儿之后屁股都不擦就走了吧!那不行,我们还应该把末尾节点的指针置为空,这样下一次别人来管理该链表的时候才能知道尾部节点在哪里 另外一个倒不是变成上面的问题,而是思路上的反应不快。回去和同学讨论这个编程题,我说了一句:“单链表只能插入到尾部啊,怎么可能在中间呢?”说出来才想起来,怎么不可能呢。闹了个大笑话。当然需要指导待插入节点的指针。 下面贴上自己认为是正确的代码片吧(还没有通过程序验证)
void insert_at_end(struct node* head,int val_to_insert) { struct node * p; p = head; while(NULL != p->next) { p = p->next; } p->next = (struct node*)malloc(sizeof(struct node)); p = p->next; p->next = NULL; p->val = val_to_insert; }
下面是在链表中间已知节点插入数值的程序
void insert_here(struct node* here,int val_to_insert) { struct node * p1,p2; p1 = here->next; p2 = (struct node*)malloc(sizeof(struct node)); p2->val = val_to_insert; here->next = p2; if(NULL != p1) { p2->next = p1; } else { p2->next = NULL; } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
初识Java 如何用数组存储对象