免费注册 查看新帖 |

Chinaunix

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

[C] 怎样判断一个单向链表中有无头节点? [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-05 15:48 |只看该作者 |倒序浏览
本帖最后由 superwujc 于 2013-11-05 15:49 编辑

定义:
  1. #define OK 1
  2. #define ERROR 0
  3. typedef int Status;                                       
  4. typedef int ElemType;                                    
  5. typedef struct Node                                       
  6. {                                                         
  7.     ElemType data;                                       
  8.     struct Node *next;                                    
  9. }Node, *LinkList;
复制代码
在指定位置(位序为i)插入元素节点e:
  1. Status ListInsert(LinkList *L,int i,ElemType e)           
  2. {                                                         
  3.     int j = 1;                                            
  4.     LinkList p,s;                                         
  5.     p = *L;
  6.     while (p && j < i)                                    
  7.     {                                                     
  8.         p = p->next;                                      
  9.         ++j;                                             
  10.     }                                                     
  11.     if (!p || j > i)                                      
  12.         return ERROR;                                    
  13.     s = (LinkList)malloc(sizeof(Node));                  
  14.     s->data = e;                                          
  15.     s->next = p->next;                                    
  16.     p->next = s;                                          
  17.     return OK;                                            
  18. }
复制代码
删除指定位置(位序为i)的元素节点,将被删除的数据值返回到指针变量e指向的空间:
  1. Status ListDelete(LinkList *L,int i,ElemType *e)         
  2. {                                                         
  3.     int j = 1;                                            
  4.     LinkList p,q;                                         
  5.     p = *L;
  6.     while (p->next && j < i)
  7.     {
  8.         p = p->next;
  9.         ++j;
  10.     }
  11.     if (!(p->next) || j > i)
  12.         return ERROR;
  13.     q = p->next;
  14.     p->next = q->next;
  15.     *e = q->data;
  16.     free(q);
  17.     return OK;
  18. }
复制代码
小弟不明白为什么插入操作中的遍历循环写法为:
  1. while (p && j < i)
复制代码
,而删除操作中的遍历循环写法为:
  1. while (p->next && j < i)
复制代码
从字面上看,二者判断指针非NULL开始的节点并不相同,一个从节点p开始,而另一个从p的后继节点p->next开始,不明白这里是为什么

网上有些资料中讲到,貌似从p开始判断指针非NULL时,p是指向头结点的,而从p->next开始判断指针非NULL时,p是指向链表的第1个元素节点的(首元节点)
但是从哪里可以得知一个链表到底是否使用了头节点呢?求指教,谢谢。

小弟初学数据结构和算法,过程比较郁闷,苦于无人请教,遇到问题只得埋头看书,然后google之
之前发过几次相关的帖子均无回应,貌似问题太低级,没办法呀,google无果,只好又回来请教各位了

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
2 [报告]
发表于 2013-11-06 09:40 |只看该作者
怎么搞得标题党似的,你的问题跟标题有什么关系呢?
另外我认为是你的学习方法不正确,搞这个东西,不能搞“形”。什么“形式”上应该怎么样,这些是玩HIGH了才去玩的。
首先你应该学会单步跟踪分析,比如链表里面一个东西都没有的时候,跟踪一遍插入操作;然后链表里面只有一个的时候再跟踪一遍删除。
看看这两个行为如果对同一个位置操作以后,是否相当于链表根本没变动过等等,这个只能你自己分析理解总结。
对于你这个例子,如果你规定“位置”从1起始的话,你这个链表显然是有头节点的。

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
3 [报告]
发表于 2013-11-06 09:59 |只看该作者
本帖最后由 superwujc 于 2013-11-06 10:00 编辑

回复 2# w_anthony
非常感谢,小弟初学,苦于身边没有人指点,不得其法
我是在Linux下用vim敲出代码然后运行的,请问学习数据结构和算法需要什么工具吗?还是只能printf?
单步调试,能简单的举个例子说明一下吗?不胜感谢!

   

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2013-11-06 10:40 |只看该作者
说实话,linux下gdb我也用的不怎么样,还是有IDE的单步跟踪比较方便,初学感觉还是VC的调试比较轻松。
至于学习“数据结构和算法”的工具,这个东西还能有什么工具?就算有,我也不知道了,真要说的话,那就是自己的脑子,多想多跟踪多调试。

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
5 [报告]
发表于 2013-11-06 10:49 |只看该作者
回复 4# w_anthony
多谢指点!

   

论坛徽章:
0
6 [报告]
发表于 2013-11-06 21:02 |只看该作者
插入操作中的遍历循环写法为:
while (p && j < i)
复制代码
,而删除操作中的遍历循环写法为:
while (p->next && j < i)

因为删除是删除p的后面一个, 代码中有用到p->next=p->next->next; 所以要保证p的下一个结点不为空,如果为空的话运行出错

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
7 [报告]
发表于 2013-11-07 09:39 |只看该作者
回复 6# xuebabybaby
多谢指点

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP