【数据结构】某双向链表中,结点结构为【 prior , data , next 】。那么删除 p 指针所指结点时,需要执行语句: p -> next -> prior - p -> prior ;(

链表不具有的特点是(A)

A.可随机访问任一元素 B.不必实现估计存储空间
C.插入、删除元素不需要移动元素 D.所需存储空间与线性表的长度成正比

在一单链表中,删除指针 p 所指的后继结点,以下语句正确的是(D)
A . free ( p -> next ); p -> next = p -> next -> next
B . p -> next = p -> next -> next ; free ( p -> next )
C . p = p -> next
D.s=p->next;p->next=s->next;free(s)

非空单链表结点结构为【 data , next 】,若指针 p 所指结点是尾结点,则(D)表达式为真
A . p -> next == P
B . p -> next != NULL
C . p == NULL
D . p -> next == NULL

单链表中增加头结点的目的是存储链表的长度(错)

顺序表结构适宜进行随机访问,而链表适宜进行插入、删除(对)

非空循环单链表 L 中, p 指针指向尾结点,则以下表达式成立的是(B)

A . p == L
B . p -> next == L
C . p == NULL
D . p -> next == NULL

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(D)存储方式最节省时间

A .带头结点的双循环链表
B .双向链表
C .单循环链表
D .顺序表

对于双向循环链表,在两个结点之间插入一个新结点需修改的指针共(A)个
A .4
B .3
C .5
D .2

循环单链表中,每个结点都有一个前驱和后继,因此循环单链表不是线性结构(错)

在带头指针的长度为 n 的双向循环链表的末尾插入一个元素,其时间复杂度为 O (1)。(填写阿拉伯数字或字母)

数据元素的顺序存储优于非顺序存储(错)

在某双向链表中删除一个结点,需要改动(2)个指针域(填写阿拉伯数字)

** 某双向链表中,结点结构为【 prior , data , next 】。那么删除 p 指针所指结点时,需要执行语句: p -> next -> prior - p -> prior 😭 p -> prior -> next = p -> next); free ( p ); **

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 算法change(p)的步骤如下: 1. 如果p为空或者p的前驱结点为空,则直接返回。 2. 定义一个临变量temp,将p的前驱结点赋值给temp。 3. 将p的前驱结点的前驱结点的next指针指向p。 4. 将p的next指针指向temp。 5. 将p的前驱结点的next指针指向p的next指针所指向的结点。 6. 如果p的next指针不为空,则将p的next指针所指向的结点的prior指针指向p的前驱结点。 7. 如果p的前驱结点的prior指针不为空,则将p的前驱结点的prior指针指向p。 8. 返回。 ### 回答2: 算法change(p)的实现步骤如下: 1. 首先判断p是否为空,若为空则返回。 2. 判断p所指向的结点是否为链表的头结点,若是则返回。 3. 定义两个指针q和r,分别指向p的前驱结点和p所指向的结点。 4. 将p的前驱结点的next指针指向p的下一个结点,保证链表的连续性。 5. 将p的前驱结点赋值给p所指向的结点的prior指针,保证链表的双向性。 6. 将p所指向的结点赋值给p的前驱结点的next指针,保证链表的双向性。 7. 将p所指向的结点的next指针指向p的前驱结点,保证链表的双向性。 8. 将p的next指针指向p所指向的结点的next指针,保证链表的连续性。 9. 将p所指向的结点的next指针赋值给p所指向的结点的prior指针,保证链表的双向性。 10. 将p所指向的结点赋值给p所指向的结点的next指针的前驱结点,保证链表的双向性。 11. 返回链表。 该算法的间复杂度为O(1),对于双向循环链表,只需要进行常数次的操作即可完成结点和其前驱结点的交换。 ### 回答3: 算法change(p)的实现思路如下: 1. 判断p是否为空指针或p所指向的结点是否为链表的头结点,如果满足条件,则无法交换,直接返回。 2. 获取p所指向的结点的前驱结点pre和后继结点next,分别通过p->prior和p->next指针获取。 3. 如果pre为头结点,则将链表的头结点修改为p所指向的结点。 4. 将p所指向的结点与pre结点的前驱结点pre_prev连接。 5. 将p所指向的结点与其后继结点next连接。 6. 将pre_prev结点与p所指向的结点连接。 7. 将p所指向的结点的前驱结点修改为pre_prev。 8. 将p所指向的结点的后继结点修改为pre。 9. 返回修改后的链表。 具体的算法实现如下: ```cpp void change(Node *p) { if (p == NULL || p->prior == NULL) { return; // 无法交换,直接返回 } Node *pre = p->prior; Node *next = p->next; if (pre == head) { head = p; // 若pre为头结点,则修改头结点 } Node *pre_prev = pre->prior; pre_prev->next = p; p->prev = pre_prev; p->next = pre; pre->prev = p; pre->next = next; if (next != NULL) { next->prev = pre; } } ``` 以上是算法change(p)的具体实现,核心思想是通过调整各个结点之间的连接关系实现结点的交换。该算法的间复杂度为O(1)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘川Lethe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值