若某链表最常用的 *** 作是在最后一个结点之后插入一个结点或者删除最后一个结点,则采用带头结点的双循环链表存储方法最节省。
双向链表是每个结点除后继指针外还有一个前驱指针。和单链表类同,双向链表也有带头结点结构和不带头结点结构两种,带头结点的双向链表更为常用;另外,双向链表也可以有循环和非循环两种结构,循环结构的双向链表更为常用。
扩展资料:
在双向链表中,每个结点包括三个域,分别是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也有很大问题,都是基本的,好好看书吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)