免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3831 | 回复: 16
打印 上一主题 下一主题

[C] 面试题求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-14 10:02 |只看该作者 |倒序浏览
本帖最后由 zehn_w 于 2012-08-15 09:31 编辑

昨天面试题目中的一小道题,主要是要求查询链表中是否有相同的单词,然后把生词添加到链表中。
我的代码:
  1. int add_word_to_list(list_node *head, const char *word)
  2. {
  3.     list_node *node;
  4.     int i;

  5.     head = head->next;
  6.     while (head->next){
  7.         //if (strcmp(head->word, word))
  8.         if (strcmp(head->word, word) == 0)
  9.             return (1);
  10.         head = head->next;
  11.     }

  12.     node = (list_node *)malloc(sizeof(list_node));
  13.     if (NULL == node)
  14.         return (-2);
  15.     // strcpy(node->word, word, 20);
  16.     strncpy(node->word, word, 20);

  17.     /* 原代码, node = head->next 好丢人~ 哈哈 */
  18.     // node = head->next;
  19.     // node->next = NULL;
  20.     /* 改正 */
  21.     head->next = node;
  22.     node->next = NULL;

  23.     return (0);
  24. }
复制代码
结构体定义:
  1. typedef struct list_node{
  2.     char word[21];
  3.     struct list_node *next;
  4. }list_node;
复制代码
然后面试官问2个问题:
1. 自己说说代码中还存在哪些隐患。
2. 排除这种方法,要求一个更高效的方法。

对于第1个问题,因为是自己写的,所以自己以为没什么大问题。(把错误修改了,谢谢大家的指导!)
对于第2个问题没有答出来,这里求大家指导一下。
代码还有其他问题也请指正,谢谢~!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-08-14 10:23 |只看该作者
至少有两处错误

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
3 [报告]
发表于 2012-08-14 10:32 |只看该作者
干嘛这么斤斤计较面试题呢, 过眼云烟

论坛徽章:
0
4 [报告]
发表于 2012-08-14 10:53 |只看该作者
两个错误!
int add_word_to_list(list_node *head, const char *word)
{
    list_node *node;

    head = head->next;
    while (head->next){
        if (strcmp(head->word, word))
            return (-1);
        head = head->next;
    }

    node = (list_node *)malloc(sizeof(list_node));
    if (NULL == node)
        return (-2);
    //strcpy(node->word, word, 20);
   strncpy(node->word, word, 20);
  
//   node = head->next;
//   node->next = NULL;
      head->next = node;
      head->next->next = NULL;
    return (0);
}

最好能返回链表头,方便使用或验证!

论坛徽章:
0
5 [报告]
发表于 2012-08-14 11:14 |只看该作者
第二个问题:
再给链表元素维持一个散列表,判断新词是否在散列中,不在的话 同步更新链表 和 散列

论坛徽章:
0
6 [报告]
发表于 2012-08-14 12:25 |只看该作者
回复 3# __BlueGuy__
不是计较是提高吧

   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
7 [报告]
发表于 2012-08-14 13:07 |只看该作者
回复 2# hellioncu


    肉眼找到四处。

论坛徽章:
0
8 [报告]
发表于 2012-08-14 14:06 |只看该作者
while (head->next){
        if (strcmp(head->word, word))
            return (-1);
        head = head->next;
    }


strcpy(node->word, word, 20);

wrod长度还没判断


Node里word长度是否足够 ?


判断重复可以用一个另外的trie树来查询。

论坛徽章:
0
9 [报告]
发表于 2012-08-14 16:50 |只看该作者
回复 7# starwing83
指出来哇~

   

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
10 [报告]
发表于 2012-08-14 18:08 |只看该作者
我发现的两个问题

1. len 长度没有判断 直接给了个20

2.        if (strcmp(head->word, word))
            return (-1);

如果不相同 则return -1?

效率的话 没研究 & 或者 位移是不是快一点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP