我一直在使用这个迭代函数,因为星期天没有任何成功,我想为排序插入创建迭代函数但是在节点绘图的一小时之后,我想我需要一些函数的帮助:
结构声明:
typedef struct E_Type * List;
struct E_Type
{
int data;
struct E_Type* next;
};
功能:
bool insert(List & l, int data) {
while (l != 0) {
for (List p = l; p; p = p->next) {
if (p->data == data)
return false;
}
if (l->data > data) {
List new_list = new E_Type;
new_list->data = data;
new_list->next = l;
l = new_list;
return true;
} else if (l->data < data) {
List new_list = new E_Type;
new_list->data = data;
l->next = new_list;
l = new_list;
return true;
}
}
if (l == 0) {
List new_list = new E_Type;
new_list->data = data;
new_list->next = l;
l = new_list;
return true;
}
}
顺便说一下:这个函数是否可行...关于此插入的所有教程,信息等都是对下一个数据的递归调用
答案 0 :(得分:1)
出现了很多错误:
l->next = new_list;
此行删除指针l->next
的先前值。
没有代码可以寻找在之前插入新元素的正确元素。
你的同时没有意义,因为你的l
指针不会从迭代变为迭代。
你最好只写一下你的函数应该做的基本步骤,并且只能在C ++中用它们编写代码。
(或者只是使用来自邻居答案的工作样本;-))
答案 1 :(得分:1)
//find the closest Node that is not > data and return it
List* find(List* l, int data) {
// l != NULL
List* current = l;
List* previous = NULL;
while(current != NULL && current->data > data) {
previous = current;
current = current->next;
}
return previous;
}
List* insert(List* l, int data) {
//l != NULL
List* current = new List();
current->data = data;
if(l->data > data) {
List* insert_position = find(l, data);
current->next = insert_position->next;
insert_position->next = current;
} else {
current->next = l;
return current;
}
return l;
}
struct List
{
int data;
List* next;
};
您真的不需要typedef
或struct
个关键字。
以上示例应该接近您的要求。你指出的内容存在一些问题。
答案 2 :(得分:1)
结构看起来很好。我试图让insert
的结构尽可能接近你的结构。我希望这些评论可以帮助你了解你做错了什么。
bool insert( List & l, int data ) {
// We have to look sequentially at all members in the *ordered* list
while ( l != 0 ) {
// We already have this data, we exit
if ( l->data == data ) return false;
// If this element's data is bigger we shift it by one spot
// so we can insert the new one
else if ( l->data > data ) {
List new_element = new E_Type;
// Save current element in the new one ( that will shift )
new_element->data = l->data;
new_element->next = l->next;
// "Insert" our new element
l->data = data;
l->next = new_element;
return true;
}
// If we didn't return before, we skip to the next element
// but only if it's not the end
if ( l->next )
l = l->next;
else
break;
}
if ( l ) {
// If we are here it means that all elements are lower than the new data.
// l currently holds the last element of the list, so we only need to add
// a new element to the list
List new_element = new E_Type;
new_element->data = data;
new_element->next = 0;
l->next = new_element;
return true;
}
else {
// If we are here it means that there was no list to begin with.
// Thus, we have to create a first element.
l = new E_Type;
l->data = data;
l->next = 0;
return true;
}
}
答案 3 :(得分:0)
我可以看到你是如何陷入困境的。您的insert
函数尝试执行多项任务(检查重复项,找到插入新元素的位置并进行实际插入),并且每项任务所需的步骤都变得混乱。
我最好的建议是退后一步,写下三个功能:
bool find_element(List l, int data)
)。List insert_front(List l, int data)
)。这个函数可以利用List
的每个元素也可以被视为列表的头部这一事实。List locate_insertion_point(List l, int data)
)的位置的函数。根据三个新功能编写insert
函数。
bool insert(List& l, int data)
{
if (find_element(l, data))
return false;
List insert = locate_insertion_point(l, data);
if (insert == NULL)
{ /* Can't insert after any point. Insert at the front */
List new_list = new E_Type;
new_list->data = data;
new_list->next = l;
l = new_list;
}
else
{ /* insert after insert */
List next = insert->next;
insert->next = insert_front(next, data);
}
return true;
}