我试图修改代码几次,但未能在代码中找到错误。我的程序正在运行,但我很难将节点添加到正确的位置。
#include<iostream>
using namespace std;
struct Node
{
int data;
struct Node *next;
}*HEAD=NULL;
void create(int a[],int n)
{
struct Node *p;
cout<<"Enter the number of elements of LL you want to display "<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
if(i==0)
{
HEAD=new Node;
p=HEAD;
p->data=a[0];
}
else
{
p->next=new Node;
p=p->next;
p->data=a[i];
}
p->next=NULL;
}
}
void insertion(struct Node *p,int pos,int x)
{
struct Node *t;
int i,n;
if(pos<0||pos>n)
cout<<"Invalid position "<<endl;
t=new Node;
t->data=x;
// t->next==NULL;
if(pos==0)
{
t->next=HEAD;
HEAD=t;
}
else
for(i=0;i<pos-1;i++)
{
p=p->next;
t->next=p->next;
p->next=t;
}
}
void display(struct Node *HEAD)
{
struct Node *p;
p=HEAD;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
}
int main()
{
struct Node *temp;
int n;
cout<<"enter the value of n "<<endl;
cin>>n;
int a[n];
cout<<"Array elements are "<<endl;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
create(a,n);
insertion(HEAD,1,15);
display(HEAD);
}
有几个问题:
-
在
insertion
中,您应该将以下语句移出循环,因为它们应该只发生一次,而且当循环根本不迭代时也应该发生一次。这就是为什么当你通过1:的位置时,你看不到添加节点的原因t->next = p->next; p->next = t;
-
CCD_ 2是不可靠的,因为CCD_。您根本不应该需要
n
。您可以在浏览列表的同时进行第二次测试,并在到达所需位置之前撞到列表的末尾。 -
不要要求在
create
中输入n
,因为您已经在主程序中获得了此输入。 -
display
函数将所有输出粘在一起,这样您就无法真正看到哪个是哪个。应该使用空格之类的分隔符分隔值。 -
不要在列表中使用全局变量。这是一种糟糕的做法,当您有多个列表时,将不允许使用这些函数。
-
不要用所有大写字母来命名那个变量。这通常是为常量保留的。
-
在C++中,分配/比较节点指针时使用
nullptr
而不是NULL
。 -
当您发现位置超出范围时,应退出该功能。
-
由于
head
不是全局变量,所以让create
返回它,并通过引用传递给insertion
。 -
注意"为什么";使用命名空间std"被认为是不好的做法?
这是一个更正的版本:
#include<iostream>
struct Node {
int data;
Node *next;
};
// Let function return the new linked list
Node *create(int a[], int n) {
Node *head = nullptr; // local variable & not CAPS
Node *p;
if (n == 0)
return nullptr;
// No input should be asked here
head = new Node;
p = head;
p->data = a[0];
for (int i = 1; i < n; i++) {
p->next = new Node;
p = p->next;
p->data = a[i];
}
p->next = nullptr;
return head;
}
void insertion(Node **head, int pos, int x) {
if (pos < 0) {
std::cout << "Invalid position " << std::endl;
return; // Should quit!
}
Node *t = new Node;
t->data = x;
if (pos == 0) {
t->next = *head;
*head = t;
} else {
Node *p = *head;
for (int i = 0; i < pos - 1; i++) {
p = p->next;
// Without n you can test out of range here:
if (p == nullptr) {
std::cout << "Invalid position" << std::endl;
delete t;
return;
}
}
// The following should happen outside the loop
t->next = p->next;
p->next = t;
}
}
void display(Node *head) {
Node *p = head;
while (p != nullptr) {
std::cout << p->data << " "; // separate with space
p = p->next;
}
std::cout << std::endl; // Newline
}
int main() {
int n;
std::cout << "Enter the value of n " << std::endl;
std::cin >> n;
int a[n];
std::cout << "Array elements are " << std::endl;
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
// Define head as local variable - no CAPS
Node *head = create(a,n);
display(head);
insertion(&head, 1, 15);
display(head);
}