Em đang làm tự học DSLK nhưng làm đến đây thì vướng. phần xóa phần tử bất kì nhưng chỉ xóa đc đầu cuối mà k xóa được các phần từ còn lại. mọi người giúp em với ạ
#include <iostream>
#include <conio.h>
using namespace std;
//khai bao 1 Node
struct node
{
int data;
node *next;
};
typedef node NODE;
//khoi tao 1 node
NODE *creat_node(int x)
{
NODE *p= new NODE;
p->data=x;
p->next=NULL;
return p;
}
//khai bao kieu danh sach lien ket
struct danhsachlienket
{
NODE *Head;
NODE *Tail;
};
typedef danhsachlienket DSLK;
//khoi tao 1 danh sach lien ket
void creat_list(DSLK &l)
{
l.Head=l.Tail=NULL;
}
//Them node p vao dau danh sach
void addhead(DSLK &l, NODE *p)
{
if (l.Head==NULL) {l.Head=l.Tail=p;}
else {p->next=l.Head,l.Head=p;};
}
//Them node vao cuoi danh sach
void addtail(DSLK &l,NODE *p)
{
if (l.Head==NULL) {l.Head=l.Tail=p;}
else {l.Tail->next=p, l.Tail=p;};
}
//them phan tu vao vi tri k
void addk(DSLK &l)
{
int dem=1, k, y;
NODE *p=l.Head;
cout<<"\nthem 1 node vao vi tri thu ";cin>>k;
cout<<"gia tri cua node can nhap "; cin>>y;
NODE *q=creat_node(y);
while (dem<k-1)
{
p=p->next;
dem++;
}
q->next=p->next;
p->next=q;
cout<<"danh sach lien ket sau khi them phan tu vao vi tri "<<k<<" la ";
for (NODE *p=l.Head; p!=NULL; p=p->next)
cout<< p->data;
}
//xoa phan tu dau danh sach
void deletehead(DSLK l)
{
NODE *p=l.Head;
if (p==l.Head)
{
p=p->next;
l.Head=p;
}
delete p;
cout<<"\ndanh sach lien ket sau khi xoa phan tu dau la ";
for (NODE *p=l.Head; p!=NULL; p=p->next)
cout<< p->data;
}
//xoa phan tu cuoi danh sach
void deletetail(DSLK l)
{
NODE *p=l.Head;
NODE *q= new NODE;
while (p->next!=l.Tail)
{
p=p->next;//tim den node ngay truoc node tail
}
q=p;//gan node p thanh node q
p=p->next;//bay gio p se la node tail can xoa
l.Tail=q;//cap nhap node tail thanh q
l.Tail->next=NULL;//neu khong cap nhap lai con tro cua tail thi con tro cua tail se van chi den p
delete p;
cout<<"\ndanh sach lien ket sau khi xoa phan tu cuoi la ";
for (NODE *p=l.Head; p!=NULL; p=p->next)
cout<< p->data;
}
//xoa phan tu o vi tri k bat ky
void deletek(DSLK l)
{
NODE *p=l.Head;
NODE *q= new NODE;
q=l.Head->next;
int dem=0,k,n;
for (p=l.Head;p!=NULL;p=p->next)
{
dem++;
}
cout<<"\ndanh sach co "<<dem<<" phan tu";
cout<<"\nxoa phan tu o vi tri ";
cin>>k;
if (k<=1) deletehead(l);
else if (k>=dem) deletetail(l);
else
{
n=0;
while (n<=k-1)
{
p=p->next;
q=q->next;
n++;
}
p->next=q->next;
delete q;
cout<<"\ndanh sach lien ket sau khi xoa phan tu tai vi tri "<<k<<" la ";
for (NODE *p=l.Head; p!=NULL; p=p->next)
cout<< p->data;
}
}
//them phan tu vao dau danh sach
void input_list(DSLK &l)
{
int n,x;
cout<< "nhap vao so phan tu cua danh sach lien ket: ";
cin>>n;
creat_list(l);
for (int i=1; i<=n; i++)
{
cout<<"phan tu thu "<<i<<" la ";cin>>x;
NODE *p=creat_node(x);
addhead(l,p);
}
}
//in ra ds sau khi da them
void out_list(DSLK l)
{
cout<<"danh sach lien ket sau khi them phan tu vao dau la ";
for (NODE *p=l.Head; p!=NULL; p=p->next)
cout<< p->data;
}
int main()
{
NODE *p;
DSLK l;
input_list(l);
out_list(l);
//addk(l);
//deletehead(l);
//deletetail(l);
deletek(l);
return 0;
}




83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?