为什么我的所有节点都指向相同的字符数组?

时间:2017-04-11 23:58:14

标签: c++ arrays list pointers

想知道我是否可以获得有关此单链表问题的帮助。

所以我有一个带有下一个指针和char指针的简单结构,以形成每个节点。

struct node{
          char * nodeName;
          node * next;
           }

在我的main函数中,我创建一个名为name的动态分配的字符数组,它将被发送到每次调用时创建一个新节点的函数,每次应该由用户输入一个新名称并且应该被分配给每个创建的新节点,但由于某些原因,所有节点都会输入最终名称。

我的猜测是所有节点都指向同一个char数组,但我不知道如何解决这个问题。这是我的代码。

int main()
{

      char * name = new char[MAX_SIZE]; // dynamic array declaration;
      for(int i = 0; i < 3; ++i) // do it x number of times.
      {
           cout << "Enter Node Name" << endl;
           cin.get(name, MAX_SIZE, '\n');
           cin.ignore(200, '\n');
           addNode(name);
      }

 return 0
}


void addNode(name[])
{
if(!head){ // creates a first node,
         head = new node;
         head->next = NULL;
         head->nodeName = "default node";
}
    node * current = head;
    node * newNode = new node;
    newNode->name = name;//assign user inputed name.
    newNode->next = NULL // set next pointer to null
    while(current->next)
     current = current->next; // traverse to the last node;
     current->next = newNode; // connect the new node at the end.

}

代码确实创建了列表,但所有节点的名称都是相同的,即用户输入的最后一个char数组。 有什么建议吗?

1 个答案:

答案 0 :(得分:3)

所有节点都指向相同的字符数组,因为您只分配了一个字符数组。那么他们还能指出什么呢?

由于每次调用 foreach (GridViewRow rw in GridView.Rows) //Loop through all the rows in the GridView { if(rw.RowType == DataControlRowType.DataRow) //Checks if current row in the loop is a valid DataRow, not a Header or Footer row (which doesn't include the CheckBox and the data) { CheckBox cbProd = (CheckBox)rw.Cells[0].FindControl("chkRow"); //Finds the checkbox in the first column HiddenField hfProd = (HiddenField)rw.Cells[0].FindControl("hfProdID"); //Finds the HiddenField in the first column where ProductID is stored if(cbProd.Checked == true) //Checks if the current checkbox is selected, if yes, execute the UPDATE query by passing the Product ID as the parameter. { string sqlConnStr = ("put actual connection string here"); string sqlCmdStr = ("UPDATE Products SET Active = 0 WHERE ProductID = @ProductID"); //UPDATE query using(SqlConnection sqlConn = new SqlConnection(sqlConnStr)) { using(SqlCommand sqlCmd = new SqlCommand(sqlCmdStr, sqlConn)) { sqlConn.Open(); sqlCmd.Parameters.Clear(); sqlCmd.Parameters.AddWithValue("ProductID", hfProd.Value); //Product ID saved in HiddenField sqlCmd.ExecuteNonQuery(); sqlConn.Close(); } } } } } 都会传递相同的指针,因此执行此操作:

addNode

您将每个节点的newNode->name = name;//assign user inputed name. 成员设置为相同的值。那不是你想要做的。

您想要做的事情取决于您没有向我们展示过的代码。您可能希望在name中分配一些内存,将提供的名称复制到其中,并将addNode设置为该指针。您必须修改代码以释放节点,以便在完成后取消分配该内存。

或者,您可以转移newNode->name中的所有权。但是,您应该更改addNode每次调用main以分配新的new对象。