Linklist Structure(将strucure指针传递给函数)

时间:2017-10-24 20:14:29

标签: c++ function pointers structure

我为链接列表创建了一个结构,然后全局声明了它的指针,然后创建了两个函数来添加节点,并显示列表。 当我全局声明结构指针时,一切正常,

然后我在main函数中声明了指针,并根据需要更改了代码。但现在当我编译并运行exe时。它让我xxxx.exe停止工作!

Tldr:将结构指针传递给函数,但它不起作用!

 #include<iostream>

 using namespace std;

 struct node {

 int data;
 node *adr;
 };


 void insertate(int n, struct node *h)
 {

    struct node *temp;
    temp = new node;
    temp->data=n;
    temp->adr=NULL;


    if(h==NULL)
    {   
        h=temp;    
    }

    else
    {
        struct node *q;
        q= new node;
        q=h;
        while(q->adr!=NULL)
        {
            q=q->adr;      
        }
        q->adr=temp;   

    } 

 }


 void  print(struct node *h)
 {

    struct node *c=h;
    while(c!=NULL)
    {
        cout<<c->data;
        c=c->adr;   
        cout<<endl;     
    }          
 }      


 int main()
 {   
    struct node *a;

    insertate(5,a);
    insertate(4,a);
    insertate(31,a);
    insertate(32,a);
    insertate(34,a);
    insertate(36,a);

    print(a);

    return 0;

 }  

1 个答案:

答案 0 :(得分:-1)

首先在main()

中分配您的头节点
struct node *a = new node;

然后尝试通过引用传递:

insertate(5, &a);

您还需要更新您的方法定义,而不是* h它将是这样的:

#include <iostream>
using namespace std;

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

void insertate(int n, struct node **h) {
  struct node *temp;
  temp = new node;
  temp->data=n;
  temp->adr=NULL;

  if(h==NULL) {
    *h=temp;
  }
  else
  {
    struct node *q;
    q= new node;
    q=*h;
    while(q->adr!=NULL)
    {
      q=q->adr;
    }
    q->adr=temp;
  }
}

void print(struct node **h)
{
  struct node *c=*h;
  while(c!=NULL)
  {
    cout<<c->data;
    c=c->adr;
    cout<<endl;
  }
}

int main() {
  struct node *a = new node;
  a->data = 0;      // Set this to initial head value
  a->adr = NULL;
  insertate(5, &a);
  insertate(4, &a);
  insertate(31, &a);
  insertate(32, &a);
  insertate(34, &a);
  insertate(36, &a);
  print(&a);
  return 0;
}

当你在方法中访问h时,因为它是一个指向指针的指针,你需要取消引用,所以注意:

q = *h;

您可以点击下面的链接进行测试,您可能想要更新您的打印功能,以便不打印出现在为0的头值:

Try it online!

通过这样做,我们通过在main函数中使用new运算符在堆上分配头指针。有些人给头指针一个虚拟变量,但在这种情况下我决定在main函数中初始化更容易。现在我们有一个指向堆中内存的指针,我们可以使用它的地址(又名&amp; operator)将它传递给我们的函数。这将创建一个指针(** h)的指针,该指针是其类型。就像常规指针一样,我们需要取消引用它才能访问它的值,这就是我们在想要访问头指针时使用* h的原因。