C 向有序链接列表添加元素

C 向有序链接列表添加元素,c,sorting,pointers,struct,linked-list,C,Sorting,Pointers,Struct,Linked List,我有下面的*addEngine函数,它将元素添加到我的链表中,我想按年份升序排序。我不能更改函数参数 它不像我想象的那样工作。为什么 a = AddEngine ( a, createEngine ( "TDI 1.9", 2015) ); 在主目录中列出时不包括 typedef struct TEngine { struct TEngine *m_Next; int m_Year; char m_Type [ TYPE_MAX ]; } TENGINE;

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

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

a = AddEngine ( a, createEngine ( "TDI 1.9", 2015) );
在主目录中列出时不包括

  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;``
        }

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

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

您也正在打印
b
,但忘记执行
b=a开始打印之前

因此,首先,您应该:

if ( list == NULL )
{
    res -> m_Next = NULL;
    res -> m_Engines = engine;  // add this line
    return res;
}
然后在列表中插入/添加一个项目

您能解释一下为什么
TARCHIVE
TENGINE
都有
m_Next
?哪一个是你的名单

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


注意
m_Engnes
中的打字错误;这应该是
m_发动机
。你的编译器没有警告你吗?请打开编译器的警告。

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

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;
}

用户Aaron7之前问过同样的问题。似乎您正在使用多个用户名。无论如何,此代码仍然不完整,无法帮助您。我建议您使用一个调试器并逐步进行调试。为了获得最小的可复制示例,您必须至少提供
TARCHIVE
TENGINE
结构以及一个简单的main,在其中您可以调用add函数。Ps:还有解释2015年的问题。你正在用三个参数调用
加法
,但只需要两个参数?!请提供问题的最低限度、可运行的演示。很抱歉,我不小心复制了它。样式问题:点
和箭头
->
运算符绑定非常紧密,不应与它们周围的空格一起使用。编写
res->m_Next
不是惯用的C语言;使用
res->m_Next
。如果你想问问题,请使用评论或编辑你的问题。“对不起,我只是想显示修改后的代码,因为我可能错过了上一块板上的内容,我找不到它。”。