若某链表最常用的 *** 作是在最后一个结点之后插入一个结点或者删除最后一个结点,则采用()存储方法最节省

若某链表最常用的 *** 作是在最后一个结点之后插入一个结点或者删除最后一个结点,则采用()存储方法最节省,第1张

若某链表最常用的 *** 作是在最后一个结点之后插入一个结点或者删除最后一个结点,则采用带头结点的双循环链表存储方法最节省。

双向链表是每个结点除后继指针外还有一个前驱指针。和单链表类同,双向链表也有带头结点结构和不带头结点结构两种,带头结点的双向链表更为常用;另外,双向链表也可以有循环和非循环两种结构,循环结构的双向链表更为常用。

扩展资料:

在双向链表中,每个结点包括三个域,分别是element域、next域和prior域,其中element域为数据元素域,next域为指向后继结点的对象引用,prior域为指向前驱结点的对象引用。

在双向链表中,有如下关系:设对象引用p表示双向链表中的第i个结点,则p.next表示第i+1个结点,p.next.prior仍表示第i个结点,即p.next.prior == p;同样地,p.prior表示第i-1个结点,p.prior.next仍表示第i个结点,即p.prior.next == p。

我给你个评价,错误百出, 你没有理解链表,对着书好好做几次。我一条一条给你评

void list::AddList(int aData)

{

int count

Node *p

p = head

//之所有没进while 是因为head==NULL,

//也就是你的链表为空链表

//可能你的链表的表头不是以空元素来代替,

while(p != NULL)

{

count++

p = p->next

}

//for循环的意思是找到第count元素吧?

//但是你没有 p = p->next,p一直在原地踏步

for(int i = 0i<counti++)

{

//while循环结束后,p一定为空,p->next会出致命

//但你的count也为0,所以for循环也进不去.

if(p->next == NULL)

p->Data = aData

}

}

//更改: 说实话,你的算法不好,

//为了让你知道错哪里,我尽量按你的思路去做吧.

void list::AddList( int dData )

{

int count = 0//下次记得初始化

//产生一个节点,初始化最好用构造函数.

Node* pNode = new Node

pNode->Data = dData

pNode->next = NULL

if ( head == NULL )//链表为空,直接赋值给head

{

head = pNode

return

}

Node* p = head

while( p != NULL )

{

count++

p = p->next

}

p = head//while结束后,p一定为空,重新赋值

for( int i = 0i <count-1i++ ) //只能是count-1

{

p = p->next

}

//结束后p指向最后一个元素

p->next = pNode//把结点加入链表

return

}

void list::DeleteList(int bData)

{

Node*p,*q

p = head//没有对head==NULL判断,会出致命

for(int j = 0j<5j++)//为什么只找5次,节点上限为5?

{

if(p->Data == bData)

{

q->next = q->next//这个......相当于 i = i

delete p

}

}

} //我知道q没有初始化,但是不知道要怎么初始化。

更正:

void list::DeleteList( int bData )

{

if ( head == NULL )//链表为空,无所谓删除

return

Node* pCurr = NULL

Node* pTemp = NULL

pCurr= head

while( pCurr != NULL )

{

if ( pCurr->Data != bData )//当前不是,向后找

{

pTemp = pCurr//将当前的保存

pCurr = pCurr->next

}

else

break

}

if ( pCurr == NULL )//没有符合要求的结点

return

if ( pTemp == NULL )//如果只有一个节点, pTemp == NULL

{

delete pCurr

head = NULL//这句一定要写

}

else

{

pTemp->next = pCurr->next

delete pCurr

}

return

}

你的printList()的输出函数不执行,是因为head==NULL, 你的是一个空链表

InsertList也有很大问题,都是基本的,好好看书吧


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11767162.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存