2016-02-27 194 views
-4

这是链表的C++代码: -链表C++节点

#include<iostream> 
using namespace std; 
class node{ 
    public: 
    int data; 
    node *next; 
}; 

void insertdata(int element ,node *head){ 

    node *newnode = new node(); 
    newnode -> data = element; 
    newnode -> next = NULL; 

    node *itr; 
    itr=head; 
    if(head == NULL) 
    head = newnode; 
    else{ 

    while(itr->next != NULL){ 
     itr = itr-> next; 
    } 

    itr->next = newnode; 
} 
} 

void print(node *head){ 
    node *print = head; 
    while(print != NULL){ 
     cout<<print->data<<"\n"; 
     print = print -> next; 
    } 
} 

int main(){ 
    node *head = NULL; 
    insertdata(10,head); 
     insertdata(20,head); 
      insertdata(30,head); 
      print(head); 
      return 0; 
} 

这是不工作这是工作的罚款,如果我宣布头全局对象。什么原因我必须在全球范围内申报。我是第二年的B.Tech学生第一次学习它,看起来很混乱。

+0

你应该正确地格式化代码。 – MikeCAT

回答

0

在C++中,函数参数为,值为,所以修改被调用者的参数不会影响调用者的局部变量。

引用可以用来修改调用者的局部变量。

#include<iostream> 
using namespace std; 
class node{ 
    public: 
    int data; 
    node *next; 
}; 

void insertdata(int element ,node *&head){ 

    node *newnode = new node(); 
    newnode -> data = element; 
    newnode -> next = NULL; 

    node *itr; 
    itr=head; 
    if(head == NULL) 
    head = newnode; 
    else{ 

     while(itr->next != NULL){ 
      itr = itr-> next; 
     } 

     itr->next = newnode; 
    } 
} 

void print(node *head){ 
    node *print = head; 
    while(print != NULL){ 
     cout<<print->data<<"\n"; 
     print = print -> next; 
    } 
} 

int main(){ 
    node *head = NULL; 
    insertdata(10,head); 
    insertdata(20,head); 
    insertdata(30,head); 
    print(head); 
    // do delete what you created via new 
    while(head != NULL){ 
     node *next = head->next; 
     delete head; 
     head = next; 
    } 
    return 0; 
} 
0

对于初学者来说,不需要声明具有类关键类的节点。用类关键字struct声明它更自然。例如

struct node 
{ 
    int data; 
    node *next; 
}; 

至于函数insertdata那么函数参数是它的局部变量。任何局部变量的改变都不会影响用作参数的原始对象。

所以,你应该声明的第二个参数或者作为参考node *如例如

void insertdata(int element, node * &head); 

或作为指针node *

void insertdata(int element, node **head); 

在第一种情况的函数定义可以像

void insertdata(int element, node * &head) 
{ 
    node *newnode = new node { element, nullptr }; 

    if (head == nullptr) 
    { 
     head = newnode; 
    } 
    else 
    { 
     node *itr = head; 
     while (itr->next != nullptr) itr = itr->next; 
     itr->next = newnode; 
    } 
} 

在第二个cas e功能定义可能看起来像

void insertdata(int element, node **head) 
{ 
    while (*head) head = &(*head)->next; 

    *head = new node { element, nullptr }; 
} 

考虑到通常新节点插入单链表的开始。

此外,当第一个参数指向列表头部时更好。

这是一个基于使用第二个函数定义的演示程序。

#include <iostream> 

struct node 
{ 
    int data; 
    node *next; 
}; 

void insertdata(node **head, int element) 
{ 
    while (*head) head = &(*head)->next; 

    *head = new node { element, nullptr }; 
} 

std::ostream & print(node *head, std::ostream &os = std::cout) 
{ 
    for (node *current = head; current != nullptr; current = current->next) 
    { 
     os << current->data << ' '; 
    } 

    return os; 
} 


int main() 
{ 
    node *head = nullptr; 

    for (int x : { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) insertdata(&head, x); 

    print(head) << std::endl; 
}   

它的输出是

1 2 3 4 5 6 7 8 9 10