c - 将元素添加到有序链接列表
问题描述
我有以下 *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_Engines
。你的编译器没有警告你吗?请打开编译器的警告。
推荐阅读
- c# - 如何使用 NetworkStream.WriteAsync 取消等待?
- regex - Git:仅提交指定的文件(重命名、删除、修改、新文件等)
- stock - Alpha Vantage API 不适用于巴西股票
- python - Python - 使用 sys.exit() 启动一个线程会杀死所有线程
- typescript - 打字稿魔法属性
- google-cloud-firestore - 带有gps距离的firestore权限
- javascript - 将一维数组中的项目配对为多维数组的最简单的普通 JavaScript 方法?
- python-3.x - 当模型包含张量操作时,Pytorch DataParallel 不起作用
- asp.net-core-3.1 - 无法将 TagBuilder InnerHtml 属性设置为某个值?
- flutter - 如何在 Flutter 中更改 iOS 键盘上输入操作按钮的颜色?