如何删除列表中除最后一次出现之外的所有元素副本?下面的代码部分工作 - 仅适用于元素的一份副本。但如果元素在开头或重复超过 2 次,则会给出不同的错误。
列表的预期结果是2 3 3 2 4 5 6 5 -> 3 2 4 6 5。但是当我们尝试执行时,我们得到:Вызвано исключение: нарушение доступа для чтения. cur было 0xFFFFFFFFFFFFFFF7.per linefor (List* cur(head); cur && cur->next; cur = cur->next) {
示例 1:有一个列表2 3 4 5 3。执行后会正确 -> 2 4 5 3
示例 2:另一个列表3 2 4 5 3。执行后写的是1个元素被删除了,但是在尝试输出后,出现错误Вызвано исключение: нарушение доступа для чтения. p было 0xFFFFFFFFFFFFFFFF.就行printf("%d", p->value);
示例 3:有很多重复的列表2 3 4 3 5 3。执行后写的是2个元素被删除了,但是显示的是2 4 5
在我看来,错误在于传递head给函数的错误Delete_copy,但我不知道如何解决它。
struct List{
int value;
List* next;
List(int val = 0, List* p = NULL) {
value = val;
next = p;
}
};
List* Insert_first(int n, List* head){
List* q = new List(n, head);
return q;
}
List* Delete_value(int n, List* head)
{
List* p = head, * t;
if (head == NULL) { puts("LIST EMPTY!"); return NULL; }
if (head->value == n)
{
t = head;
head = head->next;
delete t;
return head;
}
while (p->next != NULL)
if (p->next->value == n)
{
t = p->next;
p->next = p->next->next;
delete t;
return head;
}
else p = p->next;
puts("NO VALUE!");
return head;
}
void Print_list(List* head){
List* p = head;
puts("\n PRINT LIST");
if (p == NULL) puts("List empty!");
else
while (p != NULL){
printf("%d ", p->value);
p = p->next;
}
}
int Delete_copy(int countRes, List * head) {
std::vector<int> v;
v.push_back(head->value);
for (List* cur(head); cur && cur->next; cur = cur->next) {
if ((std::find(v.begin(), v.end(), cur->next->value) != v.end()) && cur->next) {
head = Delete_value(cur->next->value, head);
countRes++;
Delete_copy(countRes, head);
}
else {
if (cur->next){
v.push_back(cur->next->value);
}
else {
return countRes;
}
}
}
return countRes;
}
void main()
{
int i, k, n, num;
char const * ss[] = { "\n 0-Print list"," 1-Insert first", " 2-Delete copy"," 3-EXIT" };
char c{};
List* head = NULL;
k = sizeof(ss) / sizeof(ss[0]);
for (;;){
for (i = 0; i < k; i++) puts(ss[i]);
scanf_s("%c", &c);
switch (c){
case '0': Print_list(head); break;
case '1': printf("n = "); scanf_s("%d", &num); head = Insert_first(num, head); break;
case '2': printf("Was delete %d elemens", Delete_copy(0, head)); break;
case '3': return;
}
}
}
不知何故,我找到了解决方案。如果有优化的想法,我将不胜感激(您可以动态设置数组)。问题的功能
Delete_value没有改变并且在菜单中