补充一下之前中兴面试的时候的几个问题,再不不上来就要忘光了:
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;
}
}