链表实现——使用单独的 Insert()、Delete()、Print() 函数
Linked List Implementation - using separate Insert(), Delete(), Print() functions
我正在尝试使用三个独立的函数在 C++ 上实现链表:
- Insert(int x, int n) - 从位置 1 开始获取要插入的数字 (x) 和要插入的位置 (n)。
- Delete(int n) - 删除从位置 1 开始的位置 (n) 处的数字;
- Print() - 打印链表的元素。
这是我的 C++ 代码:
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* head;
void Print()
{
cout << "The List is:" ;
Node* temp = head;
while (temp -> next != NULL)
{
temp = temp -> next;
cout << " " << temp -> data;
}
}
void Delete(int n)
{
if ( n == 1 )
{
Node* temp = head;
head = temp -> next;
delete temp;
return;
}
Node* temp1 = head;
for(int i = 0; i < n-2; i++)
{
temp1 = temp1 -> next;
}
Node* temp2 = temp1 -> next;
temp1 -> next = temp2 -> next;
delete temp2;
}
void Insert(int x, int n)
{
Node* temp = new Node();
temp -> data = x;
temp -> next = NULL;
if ( n == 1 )
{
temp -> next = head;
head = temp;
return;
}
Node* temp1 = head;
for (int i = 0; i < n-2; i++)
{
temp1 = temp1 -> next;
}
temp -> next = temp1 -> next;
temp1 -> next = temp;
}
int main()
{
head = NULL;
Insert(2,1);
Insert(3,1);
Insert(99,3);
Insert(4,2);
Insert(5,3); // 3, 4, 5, 99, 2
Print(); // 1st call
Delete(2);
Delete(3); // 3,5,2
Print(); // 2nd call
return 0;
}
问题是,根据我的配置,打印函数的第一次调用产生 4、5、2、99 而不是 3、4、5、2、99。第二次调用也显示 5、99。
问题出在你的打印函数上,试试这个:
void Print()
{
cout << "The List is:";
Node* temp = head;
while (temp != NULL)
{
cout << " " << temp->data;
temp = temp->next;
}
}
您需要打印直到 temp 本身不是 NULL
。
在 C++ 中,我建议使用 nullptr
而不是 NULL
.
while循环中的两行,打印函数中的两行是倒置的。您正在将指针移动到下一个元素然后打印,因此您永远不会打印第一个元素。您的函数必须如下所示:
void Print()
{
cout << "The List is:" ;
Node* temp = head;
while (temp -> next != NULL)
{
cout << " " << temp -> data;
temp = temp -> next;
}
}
我正在尝试使用三个独立的函数在 C++ 上实现链表:
- Insert(int x, int n) - 从位置 1 开始获取要插入的数字 (x) 和要插入的位置 (n)。
- Delete(int n) - 删除从位置 1 开始的位置 (n) 处的数字;
- Print() - 打印链表的元素。
这是我的 C++ 代码:
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* head;
void Print()
{
cout << "The List is:" ;
Node* temp = head;
while (temp -> next != NULL)
{
temp = temp -> next;
cout << " " << temp -> data;
}
}
void Delete(int n)
{
if ( n == 1 )
{
Node* temp = head;
head = temp -> next;
delete temp;
return;
}
Node* temp1 = head;
for(int i = 0; i < n-2; i++)
{
temp1 = temp1 -> next;
}
Node* temp2 = temp1 -> next;
temp1 -> next = temp2 -> next;
delete temp2;
}
void Insert(int x, int n)
{
Node* temp = new Node();
temp -> data = x;
temp -> next = NULL;
if ( n == 1 )
{
temp -> next = head;
head = temp;
return;
}
Node* temp1 = head;
for (int i = 0; i < n-2; i++)
{
temp1 = temp1 -> next;
}
temp -> next = temp1 -> next;
temp1 -> next = temp;
}
int main()
{
head = NULL;
Insert(2,1);
Insert(3,1);
Insert(99,3);
Insert(4,2);
Insert(5,3); // 3, 4, 5, 99, 2
Print(); // 1st call
Delete(2);
Delete(3); // 3,5,2
Print(); // 2nd call
return 0;
}
问题是,根据我的配置,打印函数的第一次调用产生 4、5、2、99 而不是 3、4、5、2、99。第二次调用也显示 5、99。
问题出在你的打印函数上,试试这个:
void Print()
{
cout << "The List is:";
Node* temp = head;
while (temp != NULL)
{
cout << " " << temp->data;
temp = temp->next;
}
}
您需要打印直到 temp 本身不是 NULL
。
在 C++ 中,我建议使用 nullptr
而不是 NULL
.
while循环中的两行,打印函数中的两行是倒置的。您正在将指针移动到下一个元素然后打印,因此您永远不会打印第一个元素。您的函数必须如下所示:
void Print()
{
cout << "The List is:" ;
Node* temp = head;
while (temp -> next != NULL)
{
cout << " " << temp -> data;
temp = temp -> next;
}
}