求助C语言 单链表的插入、删除算法 的一些问题

【希望有热心人可以帮小弟解释下几个问题~感激不尽!】

// 本算法在链表L中第i个位置之前插入新的元素e
Status ListInsert_L(LinkList &L, int i, ElemType e)【请问“LinkList &L”的L前面为什么要加上“&”代表什么意思?】
{
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1) 【“(p && j < i-1)”是什么意思?】
{ p = p->next; ++j; } // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR; // i 大于表长或者小于1
s = new LNode; // 生成新结点
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}

//// 本算法是在链表L中,删除第i个元素,并由e返回其他值
Status ListDelete_L(LinkList &L, int i, ElemType &e) 【为什么这里的e前面要加上“&”代表什么意思?】
{
LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 寻找第 i 个结点,并令 p 指向其前趋

if (!(p->next) || j > i-1)
return ERROR; // 删除位置不合理
q = p->next; p->next = q->next;
e = q->data;【这3句完全看不懂,为什么将p->next付给q,然后又将q指向的下一个元素付给p->next,最后e = q->data是什么意思???】
free(q);
return OK;
}

希望可以解释下【】内的问题!希望有朋友可以耐心的讲解下~

第一个问题和第三个问题都是引用的意思,就是在函数中改变该变量的值会影响调用的地方的值,同时这样如果是大的对象,不是复制一个值而是原来的变量,只是一个别名。
第二个问题&&是与的意思,也就是说当p指针不为空并且j < i-1时候执行循环
最后一个三句话意思是删除一个元素,在此处删除的是指针q指向的元素,用q指向要删除的元素,然后第二句话是让当前指针的下一个元素指向q的下一个元素,也就是删除了q,然后把要删除的元素的值也就是data赋给e变量
不知道解释清楚了没有,要是不行再联系我。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-06
1,3中&均为取地址,而不是取该元素。2中&&表示与运算,就是并且的意思。
4简单的说:有3个节点啊,a,b,c;p指向a节点,q指向b,p的下一个节点指向c;既是删除b节点,并把e取为b的值,返回e。
第2个回答  2009-12-06
Status ListInsert_L(LinkList &L, int i, ElemType e)【请问“LinkList &L”的L前面为什么要加上“&”代表什么意思?】
//取L的地址

{
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1) 【“(p && j < i-1)”是什么意思?】//p不为空并且j小于i-1
{ p = p->next; ++j; } // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR; // i 大于表长或者小于1
s = new LNode; // 生成新结点
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}

//// 本算法是在链表L中,删除第i个元素,并由e返回其他值
Status ListDelete_L(LinkList &L, int i, ElemType &e) 【为什么这里的e前面要加上“&”代表什么意思?】//为了取得e的地址
{
LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 寻找第 i 个结点,并令 p 指向其前趋

if (!(p->next) || j > i-1)
return ERROR; // 删除位置不合理
q = p->next; p->next = q->next;
e = q->data;【这3句完全看不懂,为什么将p->next付给q,然后又将q指向的下一个元素付给p->next,最后e = q->data是什么意思???】
//这样来理解一下,假设有五个节点,A\B\C\D\E,每个节点包含两部分,data和next,data指该节点包含的数据,next指向下一个节点,
现在假设要删除C,我们先找到了B节点,p指向B节点,这样p->next即C节点,我们把它赋给q,现在q就是C节点,但是C节点是我们要从链表中删除的,所以我们要使B节点的next指向D节点,即p->next = q->next;这样C节点就从链表中去除了,然后再释放掉C节点占用的内存就可以了,即free(q)

//而e=q->data,是为了返回被删除的是什么数据
free(q);
return OK;
}
第3个回答  2009-12-06
【请问“LinkList &L”的L前面为什么要加上“&”代表什么意思?】
函数形参里面(type &argument)是传引用的意思,就是在函数里面改变这个参数的同时,你在外部的传进来的这个参数也会相应的发生改变。

【“(p && j < i-1)”是什么意思?】
如果p和j<i-1同时成立时执行WHILE语句

【为什么这里的e前面要加上“&”代表什么意思?】
同第一个问题

【这3句完全看不懂,为什么将p->next付给q,然后又将q指向的下一个元素付给p->next,最后e = q->data是什么意思???】
q = p->next;//指针P指向的下一个元素复制给q
p->next = q->next; //q指向的下一个元素复制给p指向的下一个元素,相当于做了交换
e = q->data;
第4个回答  2009-12-06
你前面有几个宏定义没写吧...这样不知道LinkList ElemType 代表什么类型..

【“(p && j < i-1)”是什么意思?】
这句是当p不等于0(就是p不等于NULL)而且j小于i-1时执行循环体..j等于i-1的时候循环就结束了,这个时候p指的就是第i-1个结点.(若p先等于NULL了循环也结束,就是原链表长度不到i-1了,就是出错..底下那个if就是判断这个.)

;【这3句完全看不懂,为什么将p->next付给q,然后又将q指向的下一个元素付给p->next,最后e = q->data是什么意思???】
这三句..前一个while让p指向了要被删除的结点的前一结点(不考虑出错),比如要删的事3号,p现在指的事2号.q=p->next是把要删除的结点赋给q,令q指向要被删除结点.p->next=q->next是把要被删除的结点的下一结点赋给它的前一结点的next,就是在链表中跳过被删除结点,比如3号要被删除,那句就是把4号接在2号后面,3号就不在这链表里了,但是没有真正意义被删,还是占有一段内存,后面的free(q)就是释放3号那段内存,3号就彻底删了...e=q->next这个是把要被删除的结点的成员data的值赋给e,大概是主函数里要输出被删除的结点的序号啊什么的.....
相似回答