我正在學習 DSA,并試圖實作鏈表,但我撰寫的插入函式在 for 或 while 回圈中不起作用,當我在回圈外呼叫該函式時它不一樣,它就是這樣作業的。我無法弄清楚,請有人幫助我。
#include <iostream>
class Node {
public:
int data;
Node *next;
Node(int &num) {
this->data = num;
next = NULL;
}
};
class LinkedList {
Node *head = NULL;
public:
void insert(int num) {
Node *tmp;
if (head == NULL) {
head = new Node(num);
tmp = head;
} else {
tmp->next = new Node(num);
tmp = tmp->next;
}
}
void printList() {
Node *tmp = head;
while (tmp) {
std::cout << tmp->data << " ";
tmp = tmp->next;
}
std::cout << std::endl;
}
void reverseList() {
Node *curr = head, *prev = NULL, *nextNode;
while (curr) {
nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
}
head = prev;
}
};
int main() {
LinkedList list1;
// This is not working
int num;
while (num != -1) {
std::cin >> num;
list1.insert(num);
}
// This is working
// list1.insert(1);
// list1.insert(2);
// list1.insert(3);
// list1.insert(4);
// list1.insert(5);
list1.printList();
list1.reverseList();
list1.printList();
return 0;
}
我希望在插入后
編輯:雖然@Roberto Montalti 為我解決了這個問題,但在此之前,我嘗試使用 for 回圈傳遞遞增值,該回圈有效,但一旦我拉出該cin,它就會崩潰。有人可以告訴我引擎蓋下發生了什么嗎?
for (int i = 1; i <= 10; i )
{
list1.insert(i);
}
uj5u.com熱心網友回復:
插入第 n 項(第 1 項除外)時,tmp 是一個空指標,我不明白您在那里做什么,您正在分配next一些記憶體,然后您將該指標指向另一個位置,丟失您之前分配的下一個指標,如果您想要最佳插入,則必須跟蹤最后一項。這樣,您只分配給一些 *tmp,然后超出范圍會丟失所有資料...最好的方法是只保留指向最后插入的專案的指標,無需使用 *tmp。
class LinkedList
{
Node *head = NULL;
Node *tail = NULL;
public:
void insert(int num)
{
if (head == NULL)
{
head = new Node(num);
tail = head;
}
else
{
tail->next = new Node(num);
tail = tail->next;
}
}
...
}
uj5u.com熱心網友回復:
您需要回圈直到到達串列的末尾,然后再添加新節點。像這樣。
void insert(int num) {
Node *tmp = head;
if (head == NULL) {
head = new Node(num);
}
else {
while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = new Node(num);
}
}
uj5u.com熱心網友回復:
首先,您需要為串列的每個尾部和頭部定義一個節點,如下所示
Node *h;
Node *t;
您還可以將 Node 與 LinkedList 類分開,以便輕松修改
class Node{
public:
int data;
Node *next;
Node(int data, Node* next);
~Node();
};
Node::Node(int data, Node* next)
{
this->data= data;
this->next= next;
}
Node::~Node(){}
}
之后,您可以嘗試將這些函式添加到您的 LinkedList 類中,以便它可以處理其他特殊情況,例如空串列或完整串列等。
void addToHead(int data){
Node *x = new Node(data,h);
h=x;
if(t==NULL){
t=x;
}
void addToTail(int data){
Node *x = new Node(data,NULL);
if(isEmpty()){
h=t=x;
}
else
{
t->next=x;
t=x;
}
}
現在對于插入函式,在你實作了 Node 類和其他函式之后試試這個,
void insert(int v){
if(h==nullptr){addToHead(v); return;}
if(h->data>=v) {addToHead(v);return;}
if(t->data<=v) {addToTail(v); return;}
// In this case there is at least two nodes
Node *k=h->next;
Node *p=h;
while(k != nullptr){
if(k->data >v){
Node *z =new Node(v,k);
p->next=z;
return;
}
p=k;
k=k->next;
}
}
做這一切的想法是當指標通過鏈接串列中的元素時不會丟失指標,這樣你就不會遇到運行時錯誤。
我希望這對你有用。
uj5u.com熱心網友回復:
您的插入功能存在問題。在此處閱讀有關分段錯誤的資訊https://www.geeksforgeeks.org/core-dump-segmentation-fault-c-cpp/#:~:text=Core Dump/Segmentation fault is,is known as core 轉儲。
為了快速解決方法,您可以使用它
using namespace std;
#include <iostream>
class Node
{
public:
int data;
Node *next;
Node(int num)
{
this->data = num;
next = NULL;
}
};
class LinkedList
{
Node *head = NULL;
public:
void insert(int num)
{
Node *tmp= new Node(num);
tmp->next=head;
head=tmp;
}
void printList()
{
Node *tmp = head;
while (tmp)
{
std::cout << tmp->data << " ";
tmp = tmp->next;
}
std::cout << std::endl;
}
void reverseList()
{
Node *curr = head, *prev = NULL, *nextNode;
while (curr)
{
nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
}
head = prev;
}
};
int main()
{
LinkedList list1;
// This is not working
int num,i=0,n;
cout<<"Type the value of n";
cin>>n;
while (i<n)
{
cin >> num;
cout<<num<<" "<<&num<<endl;
list1.insert(num);
i ;
}
list1.printList();
list1.reverseList();
list1.printList();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429042.html
