p->prior->next=p; p->prior=p->prior->prior;是什么意思
时间: 2023-05-29 20:07:36 浏览: 185
这是双向链表中插入节点的代码,分为两个步骤:
第一行:将新增的节点p插入到其前驱节点prior的后面,即p->prior->next=p;
第二行:将新增的节点p的前驱节点指向其前驱节点的前驱节点,即p->prior=p->prior->prior;
整体上,这段代码的作用是在双向链表中插入一个新节点p,并将其放置在其前驱节点prior的后面。
相关问题
在双向链表存储结构中,删除p所指的结点时须修改指针( )。 A.p->next->prior=p->prior; p->prior->next=p->next; B.p->next=p->next->next; p->next->prior=p; C.p->prior->next=p; p->prior=p->prior->prior; D.p->prior=p->next->next; p->next=p->prior->prior;
正确答案是 A.p->next->prior=p->prior; p->prior->next=p->next;
在双向链表中,每个结点都有一个前驱指针 prior 和一个后继指针 next,指向其前驱结点和后继结点。删除某个结点 p 时,需要将其前驱结点的后继指针指向其后继结点,同时将其后继结点的前驱指针指向其前驱结点,即 p->next->prior=p->prior; p->prior->next=p->next; 这样才能保证链表的连续性。选项 B 是删除 p 结点后将其后继结点的前驱指针指向 p 结点的后继结点,而不是指向 p 结点的前驱结点;选项 C 和 D 都存在指针越界的情况,因此都不正确。
Linklist Insert(Linklist &L,int i,int x) { int j; Lnode *s,*p=L if(i<0||i>LongthList(L)){ printf("插入位置错误\n"); return 0; } s=(Lnode*)malloc(sizeof(Lnode)); s->data=x; for(j=0;j<i;j++) //定位:若要在第i个元素之前插入,则j=i;(或者j=0,j<i-1;)少一次循环 { p=p->next; } //在i前插入 /* s->prior=p->peior; p->prior->next=s; s->next=p; p->prior=s; */ //在i之后 p->next->prior=s; s->next=p->next; p->next=s; s->prior=p; }
这段代码中有几个语法错误和拼写错误,可以按照下面的修改建议进行修改:
1. 第三行代码中 `Lnode *s,*p=L` 应该是 `Lnode *s,*p=L->next;`,缺少了 `->next`。
2. 第11行代码中的 `LongthList` 应该是 `LengthList`,这是一个拼写错误。
3. 第15行代码中的 `/*` 应该是 `//`,表示注释开始。
4. 第18行代码中的 `p->next->prior=s;` 应该是 `p->next->prev=s;`,`prior` 应该改为 `prev`。
5. 第19行代码中的 `s->next=p->next;` 应该是 `s->next=p->next;`,这是一个拼写错误。
修改后的代码应该是:
```
Linklist Insert(Linklist &L, int i, int x) {
int j;
Lnode *s, *p = L->next;
if (i < 0 || i > LengthList(L)) {
printf("插入位置错误\n");
return 0;
}
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
for (j = 0; j < i; j++) { //定位:若要在第i个元素之前插入,则j=i;(或者j=0,j<i-1;)少一次循环
p = p->next;
}
//在i前插入
/*
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
*/
//在i之后
p->next->prev = s;
s->next = p->next;
p->next = s;
s->prev = p;
}
```
这段代码的作用是在带头结点的单链表 `L` 中的第 `i` 个位置插入值为 `x` 的结点。