如何在列表的末尾添加尾部元素
How to add a tail element at end of the list
当我尝试使用此语句时: tail->prev = newElement
;然后整个程序都关闭了。我真的想知道为什么。
struct LinkedList{
string var_name;
string scope_name;
int scope; // 0 = global, 1 = public, 2 = private, 3 = ?
LinkedList* next = NULL;
LinkedList* prev = NULL;
};
struct LinkedList* head;
struct LinkedList* tail; //I made this two global
void insert(LinkedList* &head, LinkedList* &newElement, LinkedList* &tail){
newElement->next =NULL;
if(!head){
head = newElement;
return;
}
else{
LinkedList* last = head;
while(last->next != NULL){
last=last->next;
}
last->next = newElement;
newElement->prev = last;
tail = newElement;
tail = newElement->next;
tail->prev = newElement;
}
}
void LexicalAnalyzer:: var_list(){
LinkedList* new_node = new LinkedList[sizeof(LinkedList)];
GetToken();
new_node->var_name = tmp.lexeme;
new_node->scope_name = currentScope;
if(currentScope == "global")
new_node->scope = 0;
else if(pubOrPri == 1)
new_node->scope = 1;
else if(pubOrPri == 2)
new_node->scope = 2;
insert(head, new_node, tail);
//tail->prev = new_node;
display();
if(tmp.token_type == ID){
GetToken();
if(tmp.token_type == COMMA)
var_list();
else if(tmp.token_type == SEMICOLON){
return;
}
else
syntaxError();
}
else
syntaxError();
}
输出给了我
流程返回-1073741819(0xc0000005(执行时间:3.269 s。
但是,如果我删除tail-> newElement;
并取出功能中的参数尾巴。一切都很好。
我以为,尾巴是全球的,那么为什么我不直接在var_list()
功能中直接尝试tail->prev = new_Node;
,也无法正常工作。
您没有任何逻辑可以处理tail
的初始状态,即nullptr
。
更改
if(!head){
head = newElement;
return;
}
to
if(!head){
head = tail = newElement;
return;
}
另外,线
tail->prev = newElement;
需要
tail = newElement;
在else
块中。
免责声明我尚未测试该建议是否解决了问题。
尝试此逻辑,
void insert(LinkedList* &head, LinkedList* &newElement, LinkedList* &tail){
newElement->next =NULL;
if(!head){
head = tail = newElement; // your first node is both head and tail;
return;
}
else{
LinkedList* last = head;
while(last->next != NULL){
last=last->next;
}
last->next = newElement;
newElement->prev = last; // newElement is inserted to end of the list
tail = newElement; // tail is moved to last element in the list
//tail = newElement->next;
newElement->next = NULL; // tail of next is always NULL; end of the list
//tail->prev = newElement;
tail->prev = last; // tail of prev must be last
}
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 如何在列表的末尾添加尾部元素