自学c语言网课第二章笔记,数据结构(C语言版)第二章读书笔记

1.带头结点单链表的长度计算?

intListLength(LinkList L)

{

inti = 0;

LinkList p = L->next;

while(p){

++i;

p = p->next;

}

returni;

} i的初值设为0而非1,p指针设为头指针L的下一个节点,即链表除头指针之后的第一个结点,只有当p测试为非空

(while(p))之后才能增加结点数,因此此处是i = 0而不是i = 1,p是L->next而不是L.

2. 获取带头结点单链表的第i个元素?

Status GetElem(LinkList L,inti,ElemType *e)

/* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */

intj=1;/* j为计数器 */

LinkList p=L->next;/* p指向第一个结点 */

while(p&&j

{

p=p->next;

j++;

}

if(!p||j>i)/* 第i个元素不存在 */

returnERROR;

*e=p->data;/* 取第i个元素 */

returnOK;

}//Status定义为int类型,OK 和 ERROR 定义为 1 和 0,代表状态

为什么这里的j设计数器j = 1而不是前一个求单链表长度问题中的0呢(i = 0)?

因为这里我们要求的是指向第i个元素的指针。注意到在求单链表长度的代码中,当跳出循环的时候p是为NULL的,也就是说p指向的实际上是第i个元素之后的下一个元素,所以当我们要求指向第i个元素的指针的时候,我们就必须让j的初值大1,这样当退出循环的时候就能保证指针p指向的是第i个元素了。(也可以用另外的一种方式,让初始的指针小1,即令p = L而不是L->next,j的初值仍然设为0,也可以达到同样的目的,实际上这样做和前面的方法是一样的效果:保证在退出循环的时候p指向的是第i个元素而不是第i+1个元素。)

template

Node *SimpleLinkList::GetElemPtr(intposition)const

// 操作结果:返回指向第position个结点的指针

{

Node *tmpPtr = head;// 用tmpPtr遍历线性表以查找第position个结点

intcurPosition = 0;// tmpPtr所指结点的位置

while(tmpPtr != NULL && curPosition 

// 顺指针向后查找,直到tmpPtr指向第position个结点

{

tmpPtr = tmpPtr->next;

curPosition++;

}

if(tmpPtr != NULL && curPosition == position)

{// 查找成功

returntmpPtr;

}

else

{// 查找失败

returnNULL;

}

}

3.在带头结点的单链线性表L中第i个位置之前插入元素e ?

Status ListInsert(LinkList L,inti,ElemType e)

{ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */

intj=0;

LinkList p=L,s;

while(p&&j

{

p=p->next;

j++;

}

if(!p||j>i-1)/* i小于1或者大于表长 */

returnERROR;

s=(LinkList)malloc(sizeof(structLNode));/* 生成新结点 */

s->data=e; /* 插入L中 */

s->next=p->next;

p->next=s;

returnOK;

}

在这里能否用j = 1和 p = L->next 代替上面代码中 j = 0 和 p = L 呢?

其实是不能的,因为插入的位置可以在第一个结点的地方,如果我们用j = 1 和 p = L->next代替之后,就不能得到 i - 1位置是头结点的情形(因为一次都不循环while的情形下我们的p【待插入结点的前一个结点】已经是指向单链表中第一个结点 了),因此这里只好令j = 0, p = L,这样就能实现在头结点和第一个链表结点之间插入一个结点s了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值