30/09/2018, 20:43
Chỉ xóa được phần tử đầu trong DSLK
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<<"
them 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<<"
danh 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<<"
danh 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<<"
danh sach co "<<dem<<" phan tu";
cout<<"
xoa 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<<"
danh 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;
}
Bài liên quan
Bạn nên edit lại định dạng khi post code lên , có bài hướng dẫn cách post code cho ng sau dễ nhìn
Bạn thử xem lại hàm xóa xem, truyền khóa & vào chỗ tham số xem sao VD:
chẳng hạn. Mình mới chỉ xem qua, chưa chạy thử hay sửa gì cả
Bạn nên để trong markdown nhé:
Mình sửa lại code của cậu, xem qua nhé, test qua thì chuẩn rồi. Còn nhìn code của cậu muốn ném máy luôn
Cảm ơn bạn nhiều nha. Tại đang tự học với phần này tớ k hiểu lắm, xin lỗi nếu code của tớ làm bạn muốn đập máy.
Không lúc đấy mình đang bực cái khác thôi, giờ thì hết òi