Function 双链表删除后节点功能

Function 双链表删除后节点功能,function,linked-list,Function,Linked List,/*函数delete_back()有问题;我认为删除功能3部分有问题。 另外,我不知道怎么做,谢谢。 为什么我使用相同的方法删除元素不起作用 */ #包括 使用名称空间std; 模板 类双链接 { 私人: 双链*头; 双链*尾; 双链接*prev; 下一步; T数据; 公众: 双链接() { head=tail=prev=next=NULL; T数据; } 无效输入列表(双链接*头); 无效添加(td); void insert_node(); 空洞移除(双链接*v); 空推尾(td); voi

/*函数delete_back()有问题;我认为删除功能3部分有问题。 另外,我不知道怎么做,谢谢。 为什么我使用相同的方法删除元素不起作用 */

#包括
使用名称空间std;
模板
类双链接
{
私人:
双链*头;
双链*尾;
双链接*prev;
下一步;
T数据;
公众:
双链接()
{
head=tail=prev=next=NULL;
T数据;
}
无效输入列表(双链接*头);
无效添加(td);
void insert_node();
空洞移除(双链接*v);
空推尾(td);
void delete_front();
void delete_back();
无效删除元素(T d);
模板
friend ostream&operatordata=d;
if(tail==NULL)
{
水头=n;
尾=n;
}
其他的
{
tail->next=n;
n->prev=尾部;
尾=n;
}
}
模板
void doulinked::delete_front()
{
移除(头部);
}
模板
void doulinked::delete_back()
{
移除(尾部);
}
模板
void doulinked::删除(doulinked*v)
{   
如果(v->prev!=NULL&&v->next!=NULL)
{
双链接*p=v->prev;
双链接*n=v->next;
p->next=n;
n->prev=p;
删除第五条;
}
否则如果(v->prev==NULL&&v->next!=NULL)
{
双链接*n=v->next;
head->next=n;
n->prev=头部;
删除标题;
水头=n;
}
否则如果(v->prev!=NULL&&v->next==NULL)//这个循环有一些错误;
{
双链接*p=v->prev;
p->next=尾部;
尾部->上一个=p;
删除尾部;
尾=p;
}
}
模板
void doulinked::remove_ele(td)//这个循环有一些错误
{
如果(头部->数据==d)
{
移除(头部);
头部=头部->下一步;
}
其他的
头部=头部->下一步;
}
int main()
{
双链接dll;
dll.add(5123);
dll.add(1227);
dll.add(127);
dll.push_tail(1235);
推尾(834);
推尾(1595);
dll.delete_front();
//dll.delete_back();
//dll.remove_ele(834);

你的设计有点混乱

传统的C++设计链表的方法(如<代码> STD::清单< /C>)有单独的<代码>节点< /C>和List类,而不是作为一个类的两个类:

template <typename T> struct node {
    node *prev, *next;
};
template <typename T> struct list {
    node *head, *tail;
};
这将创建一个名为
data
的本地默认变量
T
,然后…对它不做任何操作。您可能希望将
data
设置为某个值。您可能希望为此使用初始值设定项。在这种情况下,您无需执行任何操作,因为这已经是默认值

我甚至不确定列表中的
应该做什么

至于
remove\u ele(td)
,您可能想删除
data==d的第一个元素,对吗?如果您先编写
find
方法,那么它就很简单:
remove(find(d))
。(我假设
find
抛出一个异常;如果您希望
find
返回null或sentinel或其他内容,而
remove_ele
返回
true
false
,显然您需要多行代码来检查查找是否有效。)

如果您不知道如何编写
find
方法……这就是链表的全部要点,所有遍历函数都有一个简单的递归定义,包括
find

node *node::find(T d) {
    if (data == d) { return this; }
    if (next) { return next->find(d); }
    return 0;
}
不管怎么说,我认为,与其在代码正常运行之前一直试图敲打代码,不如先看看各种设计的现有实现,直到理解它们之间的差异,然后选择想要的设计并尝试实现它

doulinked()
{
    head=tail=prev=next=NULL;
    T data;
}
node *node::find(T d) {
    if (data == d) { return this; }
    if (next) { return next->find(d); }
    return 0;
}