woaini92887 发表于 2014-11-28 16:24:35

指针移动 单链表

Status ListInsert_L(LinkList &L, int i, ElemType e) {// 算法2.9
// 在带头结点的单链线性表L的第i个元素之前插入元素e
LinkList p,s;
p = L;   
int j = 1;
while (p && j < i) {// 寻找第i个结点
    p = p->next;
    ++j;
}
if (!p || j > i-1) return ERROR;      // i小于1或者大于表长
s = (LinkList)malloc(sizeof(LNode));// 生成新结点
s->data = e;s->next = p->next;      // 插入L中
p->next = s;
return OK;
} // LinstInsert_L

这里面的指针P 移动了4次 最后指向那呀
假如有 10个这样的结构体用单链表连接
我想撤掉i=5
按理说第一个p=L 的时候 是指向第一个 然后经过4次 指向第5个 ,那么经过p->next=p->next->next 的时候撤除的是第6个 到底那里错了???{:5_100:}

风之残月 发表于 2014-11-28 22:28:06

因为你这个程序的单链表有头结点,所以 p = L 指向的是头结点(头结点不能算,只是用来表示单链表的表头,跟第一个结点是有区别的),p移动4次后是指向第4个,p->next=p->next->next删除第5个

ilboyvm 发表于 2014-11-29 00:40:21

这个程序是用来做什么的?

woaini92887 发表于 2014-11-29 10:40:47

风之残月 发表于 2014-11-28 22:28
因为你这个程序的单链表有头结点,所以 p = L 指向的是头结点(头结点不能算,只是用来表示单链表的表头, ...

怎么看出是有头结点呀
还有那个头结点指的是什么呀 不就是第一个结构体中数据域的地址吗

Mr.屎壳螂 发表于 2014-11-29 13:29:20

你程序的注释里面都写了带头结点的单链表.
头结点只是表示这个链表的开始,头结点并没有什么实际上的值,仅仅让你指针跳你的指针能跳回来,然后便于遍历链表.
你问题里面的说的应该L就是指向头结点的,然后你应该是从头结点走了四次,p所指的位置应该是链表的第5个节点(包括头结点的话,不包括头结点就是第4个),包不包括头结点你自己怎么算的就对应各自的情况了,删除指令删除的是你p指针指向的那个节点后面的一个节点.

风之残月 发表于 2014-11-29 19:33:19

woaini92887 发表于 2014-11-29 10:40
怎么看出是有头结点呀
还有那个头结点指的是什么呀 不就是第一个结构体中数据域的地址吗

因为你的代码里有“// 在带头结点的单链线性表L的第i个元素之前插入元素e”
页: [1]
查看完整版本: 指针移动 单链表