【发布时间】:2017-10-23 16:44:21
【问题描述】:
我的作业几乎完成了,最后一部分是编写一个函数,通过插入排序对单链表进行排序。我还受到作业的预定义结构和 typedef 的约束:
struct le {
int value;
struct le *next;
};
typedef struct le listenelement;
typedef listenelement *list;
那些我无法改变的。插入排序函数必须使用这些参数。如果参数 m 为负数,则列表按降序排序,否则按升序排序。
void sort(int m, list *l);
编辑:
这是我从这里实现答案的尝试。我仍然无法让它工作。我尝试创建一个名为“asc”(用于升序排序的列表)和一个辅助列表“aux”的最终结果的新列表,但我被卡住了..
void sort(int m, list *l){
if ((m == 0) || (*l == NULL)) {
printf("Error.\n");
} else {
if (m>0) {
listenelement head = {0,NULL};
list asc = {&head};
list aux = *l;
while (aux != NULL) {
int val = aux->value;
delete_elem(val,&aux);
while ((asc->next != NULL) && ((asc->value)<val)) {
printf("%d\n", (asc->value));
asc=asc->next;
}
insert(val,&asc);
asc = &head;
}
*l = &head;
}
}
}
【问题讨论】:
-
您认为插入排序算法的哪一部分与单链表不兼容?
-
这篇文章可能对您想要实现的目标有用。 geeksforgeeks.org/insertion-sort-for-singly-linked-list
-
你不能在单链表中“旅行”回来,这不正是插入排序需要做的吗?
-
@Vic 会的,谢谢!
-
你基本上需要一个指向你正在移动的元素的指针(如果你想避免列表开头元素的特殊情况,可能需要一个指向链接指针的指针),以及指向要移动的元素的新位置之前的元素的指针(同样,可能是指向链接指针的指针)。
标签: c sorting linked-list singly-linked-list insertion-sort