【发布时间】:2019-09-05 08:01:25
【问题描述】:
我正在尝试在 C++ 中实现单链表。在delete temp; 声明之前,deleteFromHead() 中的一切工作正常。在声明之后,head 和next 都开始指向一些垃圾值。由于这是从头部删除节点的标准方法,所以我无法找出问题所在。
完整代码如下:
#include <iostream>
#include <iomanip>
#include <limits>
#define CLEAR_INPUT_BUFFER(c) \
c.clear(); \
c.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
template <class T>
class SLLNode {
public:
T data;
SLLNode<T>* next;
SLLNode(void) {
data = static_cast<T>(0);
next = NULL;
}
SLLNode(T data) {
this -> data = data;
next = NULL;
}
~SLLNode(void) {
delete next;
}
};
template <class T>
class SLList {
private:
SLLNode<T>* head;
SLLNode<T>* tail;
public:
SLList(void) {
head = tail = NULL;
}
~SLList(void) {
delete head;
delete tail;
}
int addAtHead(T data) {
SLLNode<T>* temp;
if(!(temp = new SLLNode<T>(data))) {
return -1;
}
if(head == NULL && tail == NULL) {
head = temp;
tail = temp;
} else {
temp -> next = head;
head = temp;
}
return 0;
}
int addAtTail(T data) {
SLLNode<T>* temp;
if(!(temp = new SLLNode<T>(data))) {
return -1;
}
if(head == NULL && tail == NULL) {
head = temp;
tail = temp;
} else {
tail -> next = temp;
tail = temp;
}
return 0;
}
int deleteFromHead(void) {
if(head == NULL && tail == NULL) {
return -1;
} else if(head == tail) {
delete head;
head = NULL;
tail = NULL;
} else {
std::cout << "\nhere\n";
SLLNode<T>* temp = head;
std::cout << "temp -> data = " << temp -> data;
std::cout << "\nhead -> data = " << head -> data;
std::cout << "\n\nhead -> next -> data = " << head -> next -> data;
std::cout << "\ntemp -> next -> data = " << temp -> next -> data;
head = head -> next;
std::cout << "\n\nafter head = head -> next:";
std::cout << "\nhead -> data = " << head -> data;
std::cout << "\ntemp -> data = " << temp -> data;
delete temp;
std::cout << "\n\nafter delete temp:";
std::cout << "\nhead -> data = " << head -> data;
std::cout << "\ntemp -> data = " << temp -> data;
}
return 0;
}
int deleteFromTail(void) {
if(head == NULL && tail == NULL) {
return -1;
} else if(head == tail) {
delete tail;
head = NULL;
tail = NULL;
} else {
SLLNode<T>* temp = head;
while(temp -> next -> next != NULL) {
temp = temp -> next;
}
temp -> next = NULL;
delete tail;
tail = temp;
}
return 0;
}
void traverse(void) {
if(head == NULL && tail == NULL) {
std::cout << "\nNo node present in the linked list.";
return;
} else {
SLLNode<T>* temp = head;
std::cout << "\ntemp -> data = " << temp -> data << std::endl;
while(temp != NULL) {
std::cout << temp -> data << " ";
temp = temp -> next;
}
}
return;
}
int search(T data) {
if(head == NULL && tail == NULL) {
return -2;
} else {
int index = 1;
SLLNode<T>* temp = head;
while(temp != NULL) {
if(temp -> data == data) {
return index;
} else {
++index;
temp = temp -> next;
}
}
}
return -1;
}
};
int main(void) {
int choice;
SLList<int> sll;
while(true) {
std::cout << "\t\tSINGLY LINKED LIST DEMO PROGRAM\n\n\t\t"
<< "----------MENU----------\n\t\t"
<< "1. Add at head\n\t\t"
<< "2. Add at tail\n\t\t"
<< "3. Delete from head\n\t\t"
<< "4. Delete from tail\n\t\t"
<< "5. Traverse the list\n\t\t"
<< "6. Search the list\n\t\t"
<< "7. Exit the program\n\n"
<< "Enter your choice: ";
while(!(std::cin >> choice) || !(choice >= 1 && choice <= 7)) {
std::cout << "Please enter a valid choice: ";
CLEAR_INPUT_BUFFER(std::cin);
}
CLEAR_INPUT_BUFFER(std::cin);
switch(choice) {
case 1 : {
int data;
std::cout << "Enter the data (any number): ";
while(!(std::cin >> data)) {
std::cout << "Please enter a valid number: ";
CLEAR_INPUT_BUFFER(std::cin);
}
CLEAR_INPUT_BUFFER(std::cin);
if(sll.addAtHead(data) == -1) {
std::cerr << "\nERROR: Memory could not be allocated\n";
exit(-1);
}
}
break;
case 2 : {
int data;
std::cout << "Enter the data (any number): ";
while(!(std::cin >> data)) {
std::cout << "Please enter a valid number: ";
CLEAR_INPUT_BUFFER(std::cin);
}
CLEAR_INPUT_BUFFER(std::cin);
if(sll.addAtTail(data) == -1) {
std::cerr << "\nERROR: Memory could not be allocated\n";
exit(-1);
}
}
break;
case 3 : {
if(sll.deleteFromHead() == -1) {
std::cout << "\nLinked list is empty!";
}
}
break;
case 4 : {
if(sll.deleteFromTail() == -1) {
std::cout << "\nLinked list is empty!";
}
}
break;
case 5 : {
std::cout << "\nLinked List:\n";
sll.traverse();
}
break;
case 6 : {
int data, index;
std::cout << "Enter the data to be searched (any number) : ";
while(!(std::cin >> data)) {
std::cout << "Please enter a valid number: ";
CLEAR_INPUT_BUFFER(std::cin);
}
CLEAR_INPUT_BUFFER(std::cin);
index = sll.search(data);
if(index == -1) {
std::cout << "\nValue not found.\n";
} else if(index == -2) {
std::cout << "\nNo node is present in the linked list.\n";
} else {
std::cout << "\nValue found at node number: " << index;
}
}
break;
case 7 : {
// code
}
break;
}
}
return 0;
}
链表为:68 -> 59 -> 32 -> 74 -> 86
【问题讨论】:
-
请将您的代码发布为代码,而不是图像。
-
请不要张贴文字图片。并了解minimal reproducible example 是什么。
-
当您假设问题出在某个特定位置时,通常情况并非如此——特别是如果您不知道什么问题出在哪里。花点时间想想你销毁节点的方法是做什么的。
-
空参数列表一般写成
()。(void)适用于 C 程序员。
标签: c++ pointers singly-linked-list