【问题标题】:Adding an element to the ordered link list将元素添加到有序链接列表
【发布时间】:2020-04-14 03:20:23
【问题描述】:

我有以下 *addEngine 函数将元素添加到我的链表中,我想按年份升序排序。我不能更改函数参数。

它不像我想象的那样工作。为什么是

a = AddEngine ( a, createEngine ( "TDI 1.9", 2015) );

在 main 中列出时不包括在内?

  typedef struct TEngine 
{
    struct TEngine *m_Next;
    int m_Year;
    char m_Type [ TYPE_MAX ];
} TENGINE;

  typedef struct TArchive
{
    struct TArchive *m_Next;
    TENGINE *m_Engines;
} TARCHIVE;

TARCHIVE *addEngine ( TARCHIVE *list, TENGINE *engine) 
{
    TARCHIVE *res = (TARCHIVE*) malloc(sizeof(*res));

    if ( list == NULL )
    {
        res -> m_Next = NULL;
        return res;
    }

    int currentYear = list -> m_Engnes -> m_Year;
    if ( currentYear > engine -> m_Year )
    {
        TARCHIVE *prev = list;
        TARCHIVE *current = list -> m_Next; 

        while ( current != NULL )
        {
            if ( currentYear >= engine -> m_Year )
            {
                 res -> m_Next = prev -> m_Next;
                 prev -> m_Next = res;
                 return list;
            }
            prev = current;
            current = current -> m_Next;
        } 
        prev -> m_Next = res; 
        res -> m_Next = NULL;
    }
    return 0;
}

      int main ( void )
     {
          TARCHIVE *a, *b;
          b = a = NULL;
          a = AddEngine ( a, createEngine ( "TDI 1.9", 2015) );
          a = AddEngine ( a, createEngine ( "TDI 1.8", 3001 ) );
          a = AddEngine ( a, createEngine ( "TSI 1.2", 1999 ) );
          a = AddEngine ( a, createEngine ( "TDI 2.0", 2108 ) );
          a = AddEngine ( a, createEngine ( "TDI 1.9", 2005) );
          b = a = AddEngine ( a, createEngine ( "TDI 1.8", 1010 ) );
          a = AddEngine ( a, createEngine ( "TDI 1.9", 2025) );
          a = AddEngine ( a, createEngine ( "TDI 1.8", 2038 ) );

          while ( b )
        {
            printf ("%s", b -> m_Engines -> m_Type);
            b = b -> m_Next;``
        }

【问题讨论】:

  • 用户 Aaron7 之前问过确切的问题。似乎您使用了多个用户名。无论如何,此代码仍然不完整,无法为您提供帮助。我建议您使用调试器并单步执行。
  • 为了有一个最小的可重现示例,您必须至少提供 TARCHIVETENGINE 结构和一个简单的 main,您可以在其中调用 add 函数。 ps:并解释2015 issue
  • 你用三个参数调用AddEnding,但它只需要两个?!请提供一个最小的、可运行的问题演示。
  • 对不起,我不小心复制了。
  • 样式问题:点 . 和箭头 -> 运算符绑定非常紧密,不应与它们周围的空格一起使用。写res -> m_Next 不是惯用的C;使用res->m_Next

标签: c sorting pointers struct linked-list


【解决方案1】:

谢谢你的回答。我还应该修改什么?因为问题仍然存在,但我想我错过了一些东西。

TARCHIVE *AddEngine  ( TARCHIVE *list, TENGINE *engine )
{

  TARCHIVE * res = ( TARCHIVE * ) malloc ( sizeof ( *res ) );


    if ( list == NULL )
   {
      res -> m_Next = NULL;
      res -> m_Engines = engine;
      return res;
   }

     int currentYear = list->m_Engines->m_Year;


    // The inserted element is smaller than the first
    if ( currentYear > engine->m_Year )
  {      
      res -> m_Next = list;
      res -> m_Engines = engine;
      return res;
  }

    TARCHIVE *prev = list;
    TARCHIVE *current = list -> m_Next;

    while ( current != NULL )
  {
        currentYear = current->m_Engines->m_Year;

        if ( currentYear >= engine->m_Year )  
     {
            res -> m_Next = prev -> m_Next;
            res -> m_Engines = engine;
            prev -> m_Next = res;

            return list;
     }

        prev = current;
        current = current -> m_Next;
  }

    prev -> m_Next = res;
    res -> m_Engines = engine;
    res -> m_Next = NULL;
    return res;
}

 return 0;
}

【讨论】:

  • 如果您想提问,请使用 cmets 或编辑您的问题。
  • '对不起,我只是想显示修改后的代码,因为我可能错过了以前板上的一些内容,我找不到它。
【解决方案2】:

这不仅仅是 2015 年。它适用于您添加的所有内容。因为您确实添加了列表结构,但从不将引擎结构放入列表结构中

似乎当第一项不起作用时,您没有检查下一项是否起作用。

您也在打印b,但在开始打印之前忘记了b = a;

首先,你应该这样做:

if ( list == NULL )
{
    res -> m_Next = NULL;
    res -> m_Engines = engine;  // add this line
    return res;
}

然后在向列表中插入/添加项目时也这样做。

您能否解释一下为什么TARCHIVETENGINE 都有m_Next?你的清单是哪一个?

我还注意到,当if ( currentYear > engine -> m_Year ) 失败时,您什么也不做。因此,如果list -> m_Engnes -> m_Year(第一个列表元素)大于或等于,则忽略引擎。你应该把它放在前面。

并注意m_Engnes 中的错字;那应该是m_Engines。你的编译器没有警告你吗?请打开编译器的警告。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 2018-08-31
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多