danh sach lk don
Tao nut vao tao danh sach lien ket don
void khoitao
(LIST &&
l
{
l
.
pHead
=
l
.
pTail
=
NULL
}
NODE
*
tao_nut
int x
{
NODE
*
=new
NODE
if(
==
NULL
{
cout
<<
"
khong du bo nho:"
exit(
0
}
->
data
=
x
->
pNext
=
NULL
return
}
void tao_ds
(LIST &&
l
{
int x
NODE
*
do{
cout
<<
"
nhap x="
cin
x
if(
x
==-
1
break;
=
tao_nut
x
if(
l
.
pHead
==
NULL
l
.
pHead
=
l
.
pTail
=
else{
l
.
pTail
->
pNext
=
l
.
pTail
=
}
}while(
1
}
void xuat
(LIST
l
{ for(
NODE
*
=
l
.
pHead
=
->
pNext
{
//p=&data;
cout
<<
->
data
<<
" -> "
}
cout
<<
"NULL"
}
Tạo danh sách liên kết đơn bằng cách tự động nhập random
void Tao_DS_RANDOM
(LIST &&
l
{
int x
NODE
*
=
1
,
cout
<<
"Ban muon nhap bao nhieu phan tu: "
cin
while(
<=
{
=
tao_nut
rand
()%
100
if(
l
.
pHead
==
NULL
l
.
pHead
=
l
.
pTail
=
else {
l
.
pTail
->
pNext
=
l
.
pTail
=
}
=
++;
}
Xóa các phần tử trùng trên dslk đơn
void Xoa_PT_Trung
(LIST &&
l
{
NODE
*
p1
, *
p2
, *
truocp2
p1
=
l
.
pHead
while(
p1
// con tro p1 chay tu dau
{
p2
=
truocp2
=
p1
->
pNext
while(
p2
// con tro p2 chay sau p1
{
if(
p1
->
data
==
p2
->
data
// so sanh data p1 va p2
{
while(
truocp2
!=
p2
{
truocp2
=
truocp2
->
pNext
}
xoa_node_p
l
,
p2
p2
=
truocp2
->
pNext
}
else
p2
=
p2
->
pNext
}
p1
=
p1
->
pNext
}
}
Thêm 1 phần tử vào cuối danh sách liên kết đơn
void themcuoi
(LIST &&
l
{
//khoitao(l);
int x
cout
<<
"
nhap x="
cin
x
NODE
*
=
tao_nut
x
if(
l
.
pTail
==
NULL
l
.
pHead
=
l
.
pTail
=
else
{
l
.
pTail
->
pNext
=
l
.
pTail
=
}
}
Thêm 1 phần tử vào đầu danh sách liên kết đơn
void themdau
(LIST &&
l
{
//khoitao(l);
int x
cout
<<
"
nhap x="
cin
x
NODE
*
=
tao_nut
x
if(
l
.
pHead
==
NULL
l
.
pHead
=
l
.
pTail
=
else
{
->
pNext
=
l
.
pHead
l
.
pHead
=
}
}
Thêm phần tử y vào trước phần tử x trên danh sách liên kết đơn
int them_truoc_y_ptx
(LIST &&
l
,
int x
,
int y
{
NODE
*
=
tao_nut
y
NODE
*
q
=
timx
l
,
x
if(
l
.
pHead
==
NULL
return
0
else
{if(
q
==
NULL
return
1
if(
q
==
l
.
pHead
themdau
l
else
{
NODE
*
k
=
l
.
pHead
while(
k
->
pNext
!=
q
k
=
k
->
pNext
->
pNext
=
q
k
->
pNext
=
return
3
}
}
}
Thêm phần tử y sau phần tử x trên danh sách liên kết đơn
int them_sau_y_ptx
(LIST &
l
,
int x
,
int y
{
NODE
*
=
tao_nut
y
NODE
*
q
=
timx
l
,
x
if(
l
.
pHead
==
NULL
return
0
if(
q
==
NULL
return
1
if(
q
==
l
.
pTail
themcuoi
l
else
{
->
pNext
=
q
->
pNext
q
->
pNext
=
return
3
}
}
Xóa phần tử trước phần tử X và xóa sau phần tử X
int xoapt_truocx
(LIST &&
l
,
int x
{
NODE
*
=
timx
l
,
x
if(
l
.
pHead
==
NULL
// dsach rong
return
0
if(
==
NULL
// khong tim thay
return
1
if(
==
l
.
pHead
// phan tu can tim dung dau dsach
return
2
if(
l
.
pHead
->
pNext
==
// phan tu dung thu 2 trong dsach
{
xoadau
l
return
3
}
else
{
NODE
*
k
=
l
.
pHead
while(
k
->
pNext
!=
k
=
k
->
pNext
// tim duoc nut k ke p
NODE
*
q
=
l
.
pHead
while(
q
->
pNext
!=
k
q
=
q
->
pNext
// tim duoc nut ke nut k
q
->
pNext
=
return
4
}
}
int xoapt_saux
(LIST &
l
,
int x
{
NODE
*
=
timx
l
,
x
if(
l
.
pHead
==
NULL
return
0
if(
==
NULL
return
1
if(
==
l
.
pTail
{
return
2
}
else
{
NODE
*
k
=
->
pNext
NODE
*
=
k
->
pNext
->
pNext
=
}
}
Xóa phần tử có giá trị x trên danh sách liên kết đơn
int xoaptx
(LIST &&
l
,
int x
{
NODE
*
=
timx
l
,
x
if(
l
.
pHead
==
NULL
return
0
if(
==
NULL
return
1
if(
==
l
.
pHead
{
xoadau
l
return
2
}
if(
==
l
.
pTail
{
xoacuoi
l
return
4
}
else
{
NODE
*
k
=
l
.
pHead
while(
k
->
pNext
!=
k
=
k
->
pNext
k
->
pNext
=
->
pNext
return
3
}
}
Tìm phần tử lớn nhất (max) trên danh sách liên kết
NODE
*
timmax
(LIST
l
{
NODE
*
=
l
.
pHead
for(
NODE
*
k
=
l
.
pHead
->
pNext
k
k
=
k
->
pNext
{ if(
k
->
data
->
data
=
k
}
cout
<<
"
gia tri max="
<<
->
data
cout
<<
"
"
return
return
NULL
}
Viết hàm tìm phần tử X trong danh sach lien ket
NODE* timx(LIST l,int x)
{
for(NODE *p=l.pHead;p;p=p->pNext)
if(p->data==x)
return p;
return NULL;
}
Nối 2 danh sách liên kết đơn
void noi_ds2
(LIST &&
l
,LIST &
l1
,LIST &
l2
{
khoitao
l1
khoitao
l2
cout
<<
"
Nhap danh sach l1. Ket thuc -1"
tao_ds
l1
cout
<<
"
Nhap danh sach l2. Ket thuc -1"
tao_ds
l2
if(
l1
.
pHead
==
NULL
l
=
l2
if(
l2
.
pHead
==
NULL
l
=
l1
else{
l1
.
pTail
->
pNext
=
l2
.
pHead
l
.
pHead
=
l1
.
pHead
l
.
pTail
=
l2
.
pTail
}
Tính tổng các phần tử trên dslk đơn
long tong_list
(LIST
l
{
NODE
*
k
=
l
.
pHead
=
0
for(
k
k
!=
NULL
k
=
k
->
pNext
{
+=
k
->
data
}
return
}
Sao chép các phần tử trên danh sách liên kết đơn
void Sao_chep(LIST l,LIST &&l2)
{
khoitao(l2);
NODE * p, *p2;
p=l.pHead;
while (p)
{
p2=tao_nut(p->data);
if(l2.pHead==NULL)
l2.pHead=l2.pTail=p2;
else{
l2.pTail->pNext=p2;
l2.pTail=p2;
}
p=p->pNext;
}
Xóa toàn bộ các phần tử trên dslk đơn
void xoa_LIST
(LIST &&
l
{
NODE
*
k
=
l
.
pHead
while(
k
!=
NULL
{
l
.
pHead
=
k
->
pNext
k
=
l
.
pHead
}
}
Kiểm tra, đếm và in các số nguyên tố ra màn hình
int KTSNT
{
if(
<
2
) return
0
for(
=
2
<=
2
++)
if(
%
==
0
) return
0
return
1
}
int dem_so_ngto
(LIST
l
{
NODE
*
k
=
l
.
pHead
int dem
=
0
for(
k
k
!=
NULL
k
=
k
->
pNext
{
if(
KTSNT
k
->
data
) ==
1
dem
++;
}
return
dem
}
void in_so_ngto
(LIST
l
{
NODE
*
k
=
l
.
pHead
for(
k
k
!=
NULL
k
=
k
->
pNext
{
if(
KTSNT
k
->
data
) ==
1
cout
<<
k
->
data
<<
" "
}
}
Đảo ngược danh sách liên kết đơn
void Dao_dsach
(LIST &&
l
{
NODE
*
left
, *
right
,*
k
,*
left
=
l
.
pHead
right
=
l
.
pTail
while(
left
!=
right
{
hoanvi
left
->
data
,
right
->
data
left
=
left
->
pNext
// left ++
=
l
.
pHead
while(
->
pNext
!=
right
// right--
{
=
->
pNext
}
right
=
}
}
Bạn đang đọc truyện trên: AzTruyen.Top