如何删除C 圆形列表中最高发现元素旁边的元素
How to delete element next to the highest found element in the circular list in C++
我对某些功能/算法有问题,希望你们能帮助我。任务是编写一个函数,该函数将删除单个链接圆形列表中最高元素(最高值)之后的元素。我一直在尝试绘制这一点,所以这对我来说更有意义,但是它仍然看起来像黑暗的艺术,但是我设法提出了这样的功能:
struct node
{
node * next;
double data;
};
void Insert_node(node * & head, double v)
{
node * p = new node;
p->data = v;
if(head)
{
p->next = head->next;
head->next = p;
}
else p->next = p;
head = p;
}
void Delete_After_Max(node* & head)
{
node * tmp=head;
int counter=0,index=0;
double maximum=0;
if(tmp) // checking if the list is not empty
{
do
{
if(tmp->data>maximum)
{
maximum=tmp->data;
index=counter+1;
}
counter++;
tmp=tmp->next;
} while(tmp!=head);
}
cout<<"Biggest value on the list: "<<maximum<<endl;
cout<<"licznik:"<<counter<<" "<<"indeks: "<<index<<endl;
if(counter==(index+1))
index=0; //if last element is the maximum, first one will be deleted
else
index++; // incrementing to get index of the next element after maximum
node *tmp2=NULL;
//checking if the highest element was last(then we delete first one)
if(index==0)
{
index=counter;
}
// checking if the highest element was somewhere else
node *tmp3=NULL;
int position=0;
if((index>0)&& (index<=counter))
{
tmp2=head;
while(position<index-1)
{
tmp2=tmp2->next;
position++;
}
tmp3=tmp2->next;
tmp2->next=tmp3->next;
if(head==tmp3)
{
head=head->next;
}
delete tmp3;
}
}
您认为此算法是对的吗?我不确定我是否正确理解了这个想法,因此代码可能完全错误:/
首先,我计算列表上的所有元素,找到最高的元素,并且是索引,然后我可以使用它来删除元素,然后通过增加索引来删除元素,对吗?我认为这是可以的,但是在那之后,如果最大值是最后一个元素,我必须删除第一个元素,然后将最后一个与第二个元素"连接"?但是我不知道圆形清单是否可以,所以请有人给我一个提示我做错了什么?;)
我再次检查了一下,它进行了编译,但它的工作原理不正常,我仍然不知道为什么以及如何做。我找不到我可以基于的类似问题,任何类型的帮助都将不胜感激,我是新手,这就是为什么有这么多错误...
在提议的算法中,小错误做错了结果。
错误1 - 最大的,在最后一个loop中,tmp2
未初始化。
初始化
tmp2 = head
而不是tmp3 = head;
。
tmp2 = head; // initialize tmp2
while (position<index - 1)
{
tmp2 = tmp2->next;
position++;
}
tmp3 = tmp2->next;
错误2 - 从position
等于1开始会太早停止循环。
使用第一个
position = 1
与while条件(position < index - 1)
将循环减少2个步骤。
int position = 0;
错字错误 - 在if (index == 0)
条件下,缺失的半列。
行代码
head = head->next
不会以;
结束。
在if (index == 0)
的条件下,return
退出该功能,或通过将最后一部分插入else { ... }
条件。
if (index == 0)
{
tmp2 = head;
head = head->next;
delete tmp2;
// EXIT by return
}
添加n°1>>>>
错误3 - 案例if (index == 0)
是不可能的
尝试删除圆形链接列表的第一个节点 最大值放在最后一个节点中。
- 仅当
if (counter == index)
时,值index = 0;
才有可能。但是在do-while中,在将最大值的位置存储在index = counter;
中后,counter
是递增的counter++;
。
修改如下:
if (counter == (index+1)) // detecting the last position
index = 0; //if last element is the maximum, first one will be deleted
else
index++; // incrementing to get index of the next element after maximum
- 但是要删除第一个节点,
if (index == 0)
的提议算法不起作用,因为必须存储以前的节点。
解决方案 - 最好的解决方案是强迫最后一个loop通过执行以下更改,以便再继续一步:
if (index == 0)
{
index = counter;
}
然后允许(index == counter)
与:
if ((index>0) && (index<=counter)) // allow for the last
{
tmp2 = head;
while (position<index - 1)
以及删除tmp3
节点之前,请在tmp3 == head
时修改head
:
tmp3 = tmp2->next;
tmp2->next = tmp3->next;
if (head==tmp3) { // when the node to delete is the head
head = head->next; // shift head to the next node
}
delete tmp3;
添加n°2>>>>
output - 使用建议的值列表时获得的结果。
第一个元素
6
是已删除(最后一个元素的下一个元素18
在圆形链接列表中)。
[ 6, 9, 13, 12, 1, 10, 15, 4, 6, 18, ].
Biggest value on the list: 18
[ 9, 13, 12, 1, 10, 15, 4, 6, 18, ].
添加n°3>>>>
这是函数
Delete_After_Max()
的完整源代码:
void Delete_After_Max(node* & head)
{
node * tmp = head;
int counter = 0, index = 0;
double maximum = -1;
if (tmp) // checking if the list is not empty
{
do
{
if (tmp->data>maximum)
{
maximum = tmp->data;
index = counter;
}
counter++;
tmp = tmp->next;
} while (tmp != head);
}
std::cout << "Biggest value on the list: " << maximum << "n";
if (counter == (index+1))
index = 0; //if last element is the maximum, first one will be deleted
else
index++; // incrementing to get index of the next element after maximum
node *tmp2 = NULL;
//checking if the highest element was last(then we delete first one)
if (index == 0)
{
tmp2 = head;
std::cout << tmp2->data << ", ";
index = counter;
//head = head->next;
//delete tmp2;
// EXIT
}
// checking if the highest element was somewhere else
node *tmp3 = NULL;
int position = 0; // ERROR 1;
// if ((index>0) && (index<counter))
if ((index>0) && (index<=counter))
{
// ERROR tmp3 = head;
tmp2 = head;
while (position<index - 1)
{
tmp2 = tmp2->next;
position++;
}
tmp3 = tmp2->next;
tmp2->next = tmp3->next;
if (head==tmp3) {
head = head->next;
}
delete tmp3;
}
}
添加N°4>>>>
在更新的函数中 Delete_After_Max()
显示了bellow逻辑以删除节点的最大值是错误的。
bool Delete_After_Max(node* & head)
{
node *maxi=Find_Maximum(head);
std::cout << "Biggest value on the list: " << maxi->data << "n";
if(!Is_Empty) // !Is_Empty because this function is not working properly so i had to negate it until i find out why ;)
{
cout<<"the list is empty";
return false;
}
else
{
node *tmp3=NULL;
node *tmp2=maxi->next;
tmp3=tmp2->next;
tmp2->next=tmp3->next;
if (head==tmp3) {
head = head->next;
}
delete tmp3;
cout<<"one element deleted";
return true;
}
}
- 如果
maxi
指向具有最大值的节点,则要删除的节点为maxi->next
(而不是调用tmp2
,我们将其称为node_to_delete
)。 - 在删除
node_to_delete
之前,有必要将节点maxi
与node_to_delete
之后的节点连接(而不是调用tmp3
,我们将其称为node_after_delete
)。 - 如果
node_to_delete
是head
,则有必要在删除之前使用其下一个节点更新head
。
然后,函数的新删除部分变为:
// Step 1
node *node_to_delete = maxi->next;
// Step 2
node *node_after_delete = node_to_delete->next;
maxi->next = node_after_delete;
// Step 3
if (node_to_delete == head) {
head = head->next;
}
delete node_to_delete;
因此,功能Delete_After_Max()
中的逻辑错误是:
- 节点
maxi
与节点node_after_delete
(tmp3
)==>maxi->next=tmp3;
而不是tmp2->next=tmp3->next;
,
之间的不良连接 - 节点
node_to_delete
(tmp2
)==>if (head==tmp2)
和delete tmp2;
而不是if (head==tmp3)
和delete tmp3;
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- 使用 C++17 或更高版本对向量中的元素对求和的最'functional'方法?
- 如何在使用和无发现的情况下使用和不使用的字符串向量搜索元素
- 如何删除C 圆形列表中最高发现元素旁边的元素
- 在我试图创建一个载体中包含C 中的唯一元素的矢量时,发现不起作用
- 任何人都可以在此程序中发现错误(在 2 个通用堆栈中查找相同元素的数量)
- 填充字节发现以及数组初始值设定项中多余元素的常见和特殊编译器行为
- 防止在设置高 DPI 时放大 Win32 应用程序的 UI 元素