免费注册 查看新帖 |

Chinaunix

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

[算法] 请教单链表的问题 [复制链接]

论坛徽章:
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-01 17:16 |只看该作者 |倒序浏览
《大话数据结构》上的实现代码:
定义:
  1. typedef int Status;
  2. typedef char ElemType;
  3. typedef struct Node
  4. {
  5.     ElemType data;
  6.     struct Node *next;
  7. }Node;
  8. typedef struct Node *LinkList;
复制代码
插入指定位序的元素
  1. Status InsertElem (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.     p->data = e;
  15.     s->next = p->next;
  16.     p->next = s;
  17.     return OK;
  18. }
复制代码
删除指定位序的元素
  1. Status DeleteElem (LinkList *L, int i, ElemType *e)
  2. {
  3.     int j = 1;
  4.     LinkList p, q;
  5.     p = *L;
  6.     while (p->next && j < 1)
  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. }
复制代码
有2个疑问:
为什么插入元素的时候是从p开始判断非NULL,而删除操作时直接从p->next判断非NULL?
在删除元素的操作中,为什么写成++j,而不是j++,这里有什么影响结果的区别吗?

请各位指点一下,谢谢。

论坛徽章:
0
2 [报告]
发表于 2013-11-01 17:40 |只看该作者
第一个问,我觉得代码有问题,举个例子,加入链表只有一个节点,i 是等于2的
while (p && j < i)

07.    {   

08.        p = p->next;

09.        j++;

10.    }
运行到这里,p = 0,j = 2,然后就分配内存了,但是p已经等于0了,后面肯定有问题了
第二个问题,没影响

论坛徽章:
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-01 17:50 |只看该作者
本帖最后由 superwujc 于 2013-11-01 18:02 编辑

回复 2# twtyypmb
不好意思,写错了,应该是if (!p || j > i)
  1. Status InsertElem (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. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-11-01 18:00 |只看该作者
p->data = e;这句有问题吧怎么可能去修改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
5 [报告]
发表于 2013-11-01 18:04 |只看该作者
回复 4# twtyypmb
改了
我就是想请教一下,第二段代码为什么不是从p开始判断是否为NULL,而是直接就判断p->next

   

论坛徽章:
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
6 [报告]
发表于 2013-11-01 18:09 |只看该作者
回复 5# superwujc
个人觉得这里假设了一种情况:没有头结点,而且删除的不是头结点之后的第一个元素

   

论坛徽章:
0
7 [报告]
发表于 2013-11-01 18:34 |只看该作者
先把程序注释写出来,比如说插入函数,是往第i个前插入,还是后插入,看不到完整代码

论坛徽章:
0
8 [报告]
发表于 2013-11-01 18:46 |只看该作者
感觉写的好不清晰,如果是我写删除第i个元素,我会这样写
if( i < 1 )
    return -1;

while( p != NULL )
{
    if( j == i )
    {
        break;
    }
    j++;
    p = p->next;
}

if( p == NULL && j != i )
{
    puts( "not found");
}

论坛徽章:
0
9 [报告]
发表于 2013-11-01 19:19 |只看该作者
总觉得有什么不对,仔细看后发现了,这个删除函数不能删除链表尾部,例如只有2个节点,进入函数,循环一次后p指向了链表尾,p->next == NULL,退出循环,接着就return ERROR了回复 6# superwujc


   

论坛徽章:
1
15-16赛季CBA联赛之青岛
日期:2015-12-25 16:45:28
10 [报告]
发表于 2013-11-12 16:03 |只看该作者
本帖最后由 cfan0330 于 2013-11-12 16:45 编辑

第一个问题:楼主的删除程序写错了,j<1 应该是j < i,如果取p,而不是p->next,有可能在free的时候,p->next为空,导致程序出错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP