//数据结构
struct DataPoint
{
unsigned long d_Serial;
CString d_TideTime;
double d_TideLon;
double d_TideLat;
double d_TideHei;
DataPoint *next;
    DataPoint()
{   //
d_Serial = 0;
d_TideTime = _T("");
d_TideLon = 0.0;
d_TideLat = 0.0;
d_TideHei = 0.0;
}
};
  在头文件中这样定义的:  
  DataPoint *m_dot; //
  在构造函数中定义:
   m_dot = new DataPoint;
   m_dot->next = NULL;
  析构函数中这样释放内存
DataPoint *temp;
while (m_dot != NULL)
{
        temp = m_dot;
m_dot = m_dot->next;
delete temp;
}
  在赋值函数中这样赋值
  Tdlg dlg;  //这是自己创建的一个对话框
   DataPoint *temp, *tempdata;
   temp = m_dot;
   unsigned long  j = 0;
   if (dlg.DoModal() == IDOK)
   {
       m_serial++;   //类成员,已经在构造函数中初始化为0,这个没有什么含义
   while (temp != NULL && j < m_serial - 1)
   {
   temp = temp->next;
   j++;
   }
   tempdata = new DataPoint;
   tempdata->d_Serial = m_serial;
   tempdata->d_TideTime = dlg.m_time;
   tempdata->d_TideLon = dlg.m_lon;
   tempdata->d_TideLat = dlg.m_lat;
   tempdata->d_TideHei = dlg.m_hei;
           tempdata->next = temp->next;
   temp->next = tempdata;
   }
输出是这样的//不在赋值的那个函数中
DataPoint *temp;
temp = m_dot;
while (temp != NULL)
{
    TRACE("%d %s %f %f %f \n", temp->d_Serial, temp->d_TideTime,
temp->d_TideLon, temp->d_TideLat, temp->d_TideHei);
temp = temp->next;
}
结果为什么会多了一行这样的值,第一个0后面应该还有一个字符(初始化赋值)
0  0.000000 0.000000 0.000000 
1 1993.01.02.03.04 121.000000 22.000000 35.000000 
为什么会多出前面的一行?我只进行了一次赋值啊!

解决方案 »

  1.   

    很正常啊
    1.创建节点后没有赋初值,默认构造函数会给出0  0.000000 0.000000 0.000000 的初始值,0后面是空字符,看不见。
    2.你创建一个节点后,并赋值1 1993.01.02.03.04 121.000000 22.000000 35.000000 ,然后你把它加到前一个节点的NEXT指针上
    3.所以连表有两个节点,输出
    0  0.000000 0.000000 0.000000 
    1 1993.01.02.03.04 121.000000 22.000000 35.000000 
      

  2.   

    //这里有问题,new的这个节点并没有使用!
    //在构造函数中定义:
       m_dot = new DataPoint;//改为:
       m_dot = NULL;
      

  3.   

    如果没有用这个new DataPoint ;
    那这个链表不是没有头结点了?
      

  4.   

    赞同luoxiangdong(用代码优化人生) 的观点!
    其实还有一个办法可以让那个0代码消失,你在
    DataPoint *temp;
    temp = m_dot;
    //加上这句 temp = temp->next;
    while (temp != NULL)
    {
        TRACE("%d %s %f %f %f \n", temp->d_Serial, temp->d_TideTime,
    temp->d_TideLon, temp->d_TideLat, temp->d_TideHei);
    temp = temp->next;
    }
    这样你就可以得到完整的输出了!