написала программу для работы с односвязными списками, а именно с очердью, необходимо было удалить конкретный элемент из очереди и вставить в список после определенного(функции remove и insert соответственно), возникает проблема при вызывании подряд нескольких remove: например, при удалении 3-его элемента(теперь 4-ый будет "на месте" того третьего) если пробовать удалить 4-ый - не удаляет, то есть с одинакового места не удаляет, не могу понять в чем проблема, ведь удаляет по номеру в списке...вот код
#include <iostream>
# include <locale.h>
using namespace std;
class Spisok{
private:
struct Node
{int number;
Node *next;}
*first;//ещё нужен указатель на начало в этой секции, *с имеет такой же тип, как и структура,т.к. после '}'не стоит ';'//???как вводить n, нужно написать функцию, в которой можно будет изменять n???
public:
Spisok()
{
first=new(struct Node);
first->number=1;
first->next=NULL;}
void sozdanie (int n);//добавление в конец очереди=создание списка
void print ();//вывод очереди на печать
void remove ();//удаление заданного элемента из очереди
void insert ();//вставка элемента после заданного
void renumbering ();//перенумерация списка
};
int main()
{setlocale(LC_ALL,"Rus");
Spisok M,X;
int n;
cout<<"Введите количество элементов списка: "<<endl;
cin>>n;
if(n!=0)
{
M.sozdanie(n);
M.print();
M.remove();M.print();M.remove();M.print();M.remove();
M.print();
M.insert();
M.print();
M.renumbering();
M.print();
}
else cout<<"Нет элементов списка!!!"<<endl;
return 0;
}
void Spisok::sozdanie(int n)
{
int i;
Node *a,*b;
a=first;
b=first;
for(i=2;i<=n;i++)
{
a=new (Node);
a->number=i;
a->next=NULL;
b->next=a;
b=a;
}
}
void Spisok::print()
{Node *a;
a=first;
cout<<a->number;
while (a->next!=NULL)
{
a=a->next;
cout<<" "<<a->number;
}
cout<<endl;
};
void Spisok::remove()
{Node *a,*b;
int udal;
cout <<"Введите номер элемента,который нужно удалить: ";
cin>>udal;
if (udal==1)//если нужно удалить первый элемент
first=first->next;
else
{
a=first;
udal=udal-1;
while(a->next!=NULL)
{
if ((a->next!=NULL)&&(a->number==udal))
{
b=a;
a=a->next;
b->next=a->next;
}
else if(a->number!=udal)
a=a->next;
}
a=a->next;}
}
void Spisok::insert()
{
Node *a, *c;
c=first;
Node *d;
d=new (Node);
cout<<"Введите номер элемента,который нужно вставить:";
cin>>d->number;
d->next=NULL;
cout<<endl;
//если совпадают - то вставка осуществляется после текущего элемента, проверка в случае, когда нужно вставить элемент в начало списка
if ((d->number)>=(c->number))
{
a=c;
while (a->next!=NULL)
{
if((d->number)<=(a->next->number))
{
d->next=a->next;
a->next=d;
break;
}
a=a->next;
}
if (a->next==NULL)
a->next=d;
}
else
{
d->next = c;first=d;
}
//создавать-то создает, но при выходе из функции возвращает значение с, потом связь с->нэкст теряется почему-то??
}
void Spisok::renumbering()
{cout<<endl;
Node *a;
a=first;
a->number=1;
while(a->next!=NULL)
if ((a->next->number)==(a->number)+1)
a=a->next;
else (a->next->number)=((a->number)+1);
}
Добавлено через 1 минуту и 20 секунд:комментарии во вставке - рабочие, не обращайте внимание