C 向有序链接列表添加元素
我有下面的*addEngine函数,它将元素添加到我的链表中,我想按年份升序排序。我不能更改函数参数 它不像我想象的那样工作。为什么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;
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
。如果你想问问题,请使用评论或编辑你的问题。“对不起,我只是想显示修改后的代码,因为我可能错过了上一块板上的内容,我找不到它。”。