试编写一个在循环双向链表中进行删除操作的算法,要求删除的结点是指定结点p的前趋结点(自己创建链表)

如题所述

要删除p节点的前驱,先定义一个节点q为p的前驱节点。有如下关系:
q->pre->next=p;
p->pre=q->pre;
然后删除q节点就可以了。

# include <iostream.h>
# include <assert.h>

template <class Type>
struct DbNode
{
Type data;
DbNode<Type> *next,*pre;

DbNode(DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):next(ptr1),pre(ptr2)
{}
DbNode(Type x,DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):data(x),next(ptr1),pre(ptr2)
{}
};

template <class Type>
class DbList
{
public:
DbList()
{
head = new DbNode<Type>;
head->pre = head->next = head;
}

DbList(const DbList<Type> &dl)
{ }

~DbList()
{
Destory();
}
public:
void DeleteNode(DBNode<Type> *p)
{
DBNode<Type> *q=p->pre;

q->pre->next=p;
p->pre=q->pre;
delete q;
}

private:
DbNode<Type> *head;

void Destory()
{
DbNode<Type> *p = head->next;
while(p != head)
{
head->next = p->next;
p->next->pre = head;
delete p;
p = head->next;
}
}
};追问

帮忙编个c的呗

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-08
这么简单的问题,老师上课应该有讲的吧
第2个回答  2012-09-30
。。。。追问

????

.在双向链表存储结构中,删除p所指的结点的前趋结点(若存在)时需修改指...
说明:要想删除结点p的前趋结点,就要找到结点p的前趋结点的前趋结点q,这里为了方便说明,我叫它为结点q;p结点的前趋结点的前趋结点为:p->llink->llink,即q=p->llink->llink ①将q的后趋指向p ②将p的前趋指向q

如果要删除双向链表中p指针所指结点
要找到p这个节点的上一个节点,然后让这个节点的next指向p-》next,然后让p-》next-》front(好像是这个,就是指向上一节点的那个指针域)=p-》front,最后free p就行了。

用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作。新手...
public void insertLast(Object obj);\/\/将新元素作为末元素插入 public Object removeFirst() throws ExceptionQueueEmpty;\/\/删除首元素 public Object removeLast() throws ExceptionQueueEmpty;\/\/删除末元素 public void Traversal();\/\/遍历 } 双向链表实现:\/\/Deque_DLNode.java \/ 基于双向链表实现双端...

数据结构作业
即从尾指针出发能访问链表上任何一个结点。 单循环链表,双链表,双循环链表★2.3 设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。并且分析算法的时间复杂度。 #define arrsize 100 int InsertOrder(int A[], int elenum, int x...

数据结构— 循环链表、双向(循环)链表
结点的具体构成:双向链表创建的过程中,每一个结点需要初始化数据域和两个指针域,一个指向直接前趋结点,另一个指向直接后继结点。创建一个双向链表line(1,2,3):比如在(1,2,3)中插入一个结点 4,变成(1,4,2,3)。实现效果图:在双向链表中插入数据时,首先完成图中标注为 1 的两...

设计一个在带头结点的单链表中删除第i个结点的算法
\/\/删除节点 删除第i个节点int Delete_Positon_LL(LinkList *phead,int i){LinkList p,q;\/\/p为值是x的节点,q是p的前一个节点int j;if((*phead)->next == NULL)\/\/如果链表为空,做下溢处理{printf("单链表为空!\\n");return 0;}if(i == 1) \/\/如果是表头,表头后移{ p=(*phead)...

...结点的双向循环链表L=(a1,a2,...,an).试写一个时
1 3 4 2(4是从2的前面插入链表)1 3 5 4 2(5是从3的后面插入链表)...1 3 5 ...n ...6 4 2 由此,我们可以设置2个指针p,q,分别指向刚刚序号为奇数的元素插入的位置和刚刚序号为奇数的元素插入的位置,下一个序号为奇数的元素插入到p后,为偶数的插入到q前,并随着插入的过程实...

双向栈的基本操作算法
p->prior=s;\/\/⑥ } ②双链表上删除结点*p自身的操作 void DDeleteNode(DListNode *p){\/\/在带头结点的双链表中,删除结点*p,设*p为非终端结点 p->prior->next=p->next;\/\/① p->next->prior=p->prior;\/\/② free(p);\/\/③ } 注意:与单链表上的插入和删除操作不同的是,在双链表中...

在一个双链表中删除*p结点之后的一个结点的操作是 A.p->next=p->next...
这个当然是选择B啦,第一步已经将p->next指针指向了他的下一个节点的下一个节点,这样再访问p->next的时候实际上已经是未变前的下一个节点的下一个节点。

在双向链表中,结点有前驱和后继指针域prior和next,若p指向某结点,欲从...
p->prior->next=p->next;p-next->prior=p->prior;free(p);

相似回答