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;
}
jndvpr2202 viết 22:48 ngày 30/09/2018

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

Do Quang Duy viết 22:51 ngày 30/09/2018

Bạn thử xem lại hàm xóa xem, truyền khóa & vào chỗ tham số xem sao VD:

void deletek( DSLK &l ) { }

chẳng hạn. Mình mới chỉ xem qua, chưa chạy thử hay sửa gì cả

Người bí ẩn viết 22:58 ngày 30/09/2018

Bạn nên để trong markdown nhé:

code
Do Quang Duy viết 22:53 ngày 30/09/2018

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

#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;
	} /* DOAN NAY DAU ; ROI DAU , LUNG TUNG MINH SUA LAI, DE NHU BAN MA CHAY DC CHAC TROLL */
}

//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;
	} /* SUA TUONG TU O TREN */
}

//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)
/* HAM NAY VE CO BAN LA CAU VIET SAI, MINH SUA BEN CANH LUON 
   NHUNG HAM NAY DO KHONG TRUYEN THEO KIEU THAM CHIEU (&l) NEN
   THAO TAC XOA DAU CHI CO O TRONG HAM THOI, THUC CHAT RA KHOI HAM
   THI DANH SACH KHONG BI THAY DOI, VAN THE +_____+*/
{
	NODE *p=l.Head;
//	if (p==l.Head) { /* p == l.head chac troll */
//		p = p->next;
//		l.Head=p;
//	}
	if ( p ) { /* XEM NAY */
		l.Head = p->next;
	}
	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<<" --> ";
	printf( "NULL\n" );
}

//xoa phan tu cuoi danh sach
void deletetail(DSLK l)
/* HAM NAY DO KHONG TRUYEN THEO KIEU THAM CHIEU (&l) NEN
   THAO TAC XOA DAU CHI CO O TRONG HAM NAY THOI, THUC CHAT RA KHOI HAM
   THI DANH SACH KHONG BI THAY DOI, VAN THE +_____+*/
{
	NODE *p=l.Head;
	NODE *q = NULL; /* KHONG CAN CAP PHAT LAM GI */
	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<<" --> ";
	printf( "NULL\n" );
}
//xoa phan tu o vi tri k bat ky
void deletek(DSLK l)
{
	NODE *p=l.Head;
	NODE *q= NULL; /* GAN THE NAY DC ROI */
	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=1; /* n = 1 MOI DUNG */
		p = NULL; /* TU CHO NAY CAU VIET LANG NHANG MINH VIET LAI, CO GANG HIEU NHA, DOC CODE MUON DAP LAPTOP */
		q = l.Head;
		while (n<=k-1) { /* VONG WHILE NAY TIM Q LA THANG CAN XOA VA P LA THANG DUNG NGAY TRUOC Q TRONG DANH SACH */
			p = q;
			q = q->next;
			n++;
		}
		if ( q != NULL ) { /* NEU Q LA THANG CAN XOA TON TAI, TH BANG NULL LA THANG TRC NO LA TAIL ROI, KHONG CAN XOA NUA */
			p->next=q->next;
			if ( q == l.Tail ) /* NEU THANG CAN XOA LA TAIL THI CAP NHAT LAI TAIL */
				l.Tail = p;
			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<<" --> "; /* SUA THE NAY DE IN CHO DE NHIN */
		printf( "NULL\n" );
	}
}

//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<<" --> ";
	printf( "NULL\n" );
}
int main()
{
	NODE *p;
	DSLK l;
	input_list(l);
	out_list(l);
//addk(l);
//	deletehead(l);
//	deletetail(l);
	deletek(l);
	return 0;
}
hangdk viết 22:46 ngày 30/09/2018

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.

Do Quang Duy viết 22:55 ngày 30/09/2018

Không lúc đấy mình đang bực cái khác thôi, giờ thì hết òi

Bài liên quan
0