c - 将元素添加到有序链接列表

标签 c sorting pointers struct linked-list

我有以下 *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;``
        }

最佳答案

这不仅仅是 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。你的编译器没有警告你吗?请打开编译器的警告。

关于c - 将元素添加到有序链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59445101/

相关文章:

arrays - 函数中 str[strlen(src)+1] 和 char *str=(char*)malloc((strlen(src)+1)*sizeof(char)) 的区别

c - 如果地址已知,如何通过指针处理地址内容而不触发段错误?

C - 像这样使用 malloc 有什么问题?

lucene - 如何在 lucene 中对等分应用默认排序?

java - 在 Java 中按姓氏字母顺序对学生数组进行排序

javascript - 单击 ExtJS 中的标题对网格中的日期列进行排序

在C中将char转换为int

mysql - 连接到服务器并执行多个命令

c - strncpy 和 strcat 用法

c++ - 变量名和指针有什么区别?