SENARAI BERANTAI
Soal & Penyelesaian
1.
Tulislah sebuah program C++ untuk merealisasikan
senarai berantai.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
//Simpul.cpp
//Mendemonstrasikan Simpul berantai.
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
int iData; //item data
double dData; //item data
//pointe ke
Simpul berikutnya
Simpul*
pBrktnya;
Simpul(int id, double dd) : //konstruktor
iData(id),
dData(dd), pBrktnya(NULL)
{ }
void tampilSimpul() //menampilkan
Simpul
{
cout
<< "{" << iData << ", " << dData
<< "} ";
}
}; //akhir kelas Simpul
class SenaraiBerantai
{
private:
//pointe ke
Simpul pertama
Simpul*
pPertama;
public:
SenaraiBerantai() : pPertama(NULL) //konstruktor
{ } //(masih
belum ada Simpul)
bool apaKosong() //true jika senarai
berantai kosong
{ return pPertama==NULL; }
//menyisipkan
ke awal senarai
void sisipPertama(int id, double dd)
{ //membuat
simpul baru
Simpul*
pSenaraiBaru = new Simpul(id, dd);
pSenaraiBaru->pBrktnya =
pPertama;
pPertama
= pSenaraiBaru;
}
Simpul*
bacaPertama() //menghasilkan Simpul pertama
{ return pPertama; }
void hapusPertama() //menghapus
Simpul pertama
{ //(asumsi
senarai berantai tidak kosong)
Simpul*
pTemp = pPertama; //menyimpan simpul pertama
pPertama
= pPertama->pBrktnya;
delete pTemp;
}
void tampilSenarai()
{
cout
<< "Senarai Berantai
(pertama-->akhir): ";
Simpul*
pSkrg = pPertama; //berawal di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
pSkrg->tampilSimpul(); //menampilkan data
//bergerak
ke simpul berikutnya
pSkrg
= pSkrg->pBrktnya;
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantai
int main()
{
//menciptakan
senarai berantai baru
SenaraiBerantai
senaraiBerantai;
//menyisipkan
empat item
senaraiBerantai.sisipPertama(22,
2.99);
senaraiBerantai.sisipPertama(44, 4.99);
senaraiBerantai.sisipPertama(66, 6.99);
senaraiBerantai.sisipPertama(88, 8.99);
senaraiBerantai.tampilSenarai(); //menampilkan senarai
while( !senaraiBerantai.apaKosong() )
//sampai kosong,
{
//membaca
simpul pertama
Simpul* pTemp
= senaraiBerantai.bacaPertama();
//menampilkan
kuncinya
cout <<
"Menghapus simpul dengan
kunci " << pTemp->iData << endl;
senaraiBerantai.hapusPertama(); //remove it
}
senaraiBerantai.tampilSenarai();
//menampilkan senarai kosong
getch();
return 0;
} //akhir main()
|
Senarai Berantai (pertama-->akhir): {88,
8.99} {66, 6.99} {44, 4.99} {22, 2.99}
Menghapus simpul dengan kunci 88
Menghapus simpul dengan kunci 66
Menghapus simpul dengan kunci 44
Menghapus simpul dengan kunci 22
Senarai Berantai (pertama-->akhir):
2.
Tulislah sebuah program C++ untuk merealisasikan
senarai berantai dengan operasi penghapusan dan pencarian dari simpul tertentu.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
//senaraiBerantaiSpesifik.cpp
//Mendemonstrasikan Simpul berantai dengan
//operasi pencarian dan penghapusan simpul tertentu.
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
int iData; //item data
double dData; //item data
//pointe ke
Simpul berikutnya
Simpul*
pBrktnya;
Simpul(int id, double dd) : //konstruktor
iData(id),
dData(dd), pBrktnya(NULL)
{ }
void tampilSimpul() //menampilkan
Simpul
{
cout
<< "{" << iData << ", " << dData
<< "} ";
}
}; //akhir kelas Simpul
class SenaraiBerantai
{
private:
//pointe ke
Simpul pertama
Simpul*
pPertama;
public:
SenaraiBerantai() : pPertama(NULL)
//konstruktor
{ } //(masih
belum ada Simpul)
~SenaraiBerantai()
//destruktor
{
Simpul*
pSkrg = pPertama; //berawal di awal senarai
while(pSkrg != NULL) //sampai senarai kosong,
{
Simpul* pLama = pSkrg; //menyimpan simpul skrg
pSkrg
= pSkrg->pBrktnya; //ke simpul brktnya
delete pLama; //menghapus simpul lama
}
}
//menyisipkan
ke awal senarai
void sisipPertama(int id, double dd)
{ //membuat
simpul baru
Simpul*
pSenaraiBaru = new Simpul(id, dd);
pSenaraiBaru->pBrktnya = pPertama;
pPertama
= pSenaraiBaru;
}
Simpul* cari(int kunci) //mencari
simpul dengan kunci tertentu
{ //(asumsi
senarai berantai tak-kosong)
Simpul*
pSkrg = pPertama; //berawal di awal senarai
while(pSkrg->iData != kunci) //ketika
tidak ada kecocokan,
{
if(pSkrg->pBrktnya == NULL) //jika akhir senarai,
return NULL; //tidak menemukannya
else //tidak akhir senarai,
pSkrg = pSkrg->pBrktnya; //ke simpul berikutnya
}
return pSkrg; //ditemukan
}
bool hapus(int kunci) //menghapus simpul dengan kunci tertentu
{ //(asumsi
senarai berantai tak-kosong)
Simpul*
pSkrg = pPertama; //mencari simpul
Simpul*
pSblmnya = pPertama;
while(pSkrg->iData != kunci)
{
if(pSkrg->pBrktnya == NULL)
return false; //tidak ditemukan
else
{
pSblmnya = pSkrg; //ke simpul berikutnya
pSkrg = pSkrg->pBrktnya;
}
}
//ditemukan
if(pSkrg == pPertama) //jika simpul
pertama,
pPertama = pPertama->pBrktnya; //mengubah simpul pertama
else //sebaliknya,
pSblmnya->pBrktnya = pSkrg->pBrktnya;
delete pSkrg; //menghapus simpul
return true; //penghapusan
berhasil
}
void tampilSenarai()
{
cout
<< "Senarai Berantai
(pertama-->akhir): ";
Simpul*
pSkrg = pPertama; //berawal di awal senarai
while(pSkrg != NULL) //sampai akhir
senarai,
{
pSkrg->tampilSimpul(); //menampilkan data
//bergerak ke simpul
berikutnya
pSkrg
= pSkrg->pBrktnya;
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantai
int main()
{
SenaraiBerantai
senaraiBerantai; //menciptakan senarai
senaraiBerantai.sisipPertama(22,
2.99); //menyisipkan 4 item
senaraiBerantai.sisipPertama(44, 4.99);
senaraiBerantai.sisipPertama(66, 6.99);
senaraiBerantai.sisipPertama(88, 8.99);
senaraiBerantai.tampilSenarai(); //display list
int cariKunci = 44; //mencari item
Simpul* pCari =
senaraiBerantai.cari(cariKunci);
if( pCari != NULL)
cout <<
"Ditemukan dengan kunci
" << pCari->iData << endl;
else
cout <<
"Tidak menemukan simpul yang
dicari" << endl;
int hapusKunci = 66; //menghapus item
bool hapusOK =
senaraiBerantai.hapus(hapusKunci);
if( hapusOK )
cout <<
"Dihapus simpul dengan
kunci "
<< hapusKunci << endl;
else
cout <<
"Tidak menemukan simpul
yang ingin dihapus"
<< endl;
senaraiBerantai.tampilSenarai();
//menampilkan senarai
getch();
return 0;
} //akhir main()
|
Senarai Berantai (pertama-->akhir): {88,
8.99} {66, 6.99} {44, 4.99} {22, 2.99}
Ditemukan dengan kunci 44
Dihapus simpul dengan kunci 66
Senarai Berantai (pertama-->akhir): {88,
8.99} {44, 4.99} {22, 2.99}
3.
Tulislah sebuah program C++ untuk merealisasikan
tumpukan menggunakan senarai berantai.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
//senaraiBerantaiTumpukan.cpp
//Mendemonstrasikan tumpukan
//yang diimplementasikan dengan senarai berantai
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
Simpul* pBrktnya;
//simpul berikutnya dalam senarai
Simpul(double dd) : dData(dd),
pBrktnya(NULL)
{ } //konstruktor
void tampilSimpul() //menampilkan
simpul
{ cout <<
dData << " "; }
}; //akhir kelas Simpul
class SenaraiBerantai
{
private:
//pointer ke
item pertama pada senarai
Simpul*
pPertama;
public:
SenaraiBerantai() : pPertama(NULL) //konstruktor
{ }
~SenaraiBerantai()
//destruktor (menghapus simpul)
{
Simpul*
pSkrg = pPertama; //berawal di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
Simpul* pLama = pSkrg; //menyimpan simpul skrg
pSkrg
= pSkrg->pBrktnya; //berpindah ke simpul brktnya
delete pLama;
}
}
bool apaKosong() //true jika senarai
kosong
{ return (pPertama==NULL); }
void sisipPertama(double dd) //menyisipkan
di awal senarai
{ //menciptakan
simpul baru
Simpul*
pSimpulBaru = new Simpul(dd);
pSimpulBaru->pBrktnya = pPertama;
pPertama
= pSimpulBaru;
}
double hapusPertama() //delete first
item
{
//(diasumsikan senarai tak-kosong)
Simpul*
pTemp = pPertama;
pPertama
= pPertama->pBrktnya;
double kunci = pTemp->dData;
delete pTemp;
return kunci;
}
void tampilSenarai() //menampilkan
semua senarai
{
Simpul*
pSkrg = pPertama; //di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
pSkrg->tampilSimpul(); //menampilkan data
pSkrg
= pSkrg->pBrktnya; //ke simpul berikutnya
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantai
class TumpukanSenarai
{
private:
SenaraiBerantai* pSenarai; //pointer ke senarai berantai
public:
TumpukanSenarai() //konstruktor
//menciptakan
senarai berantai
{ pSenarai = new SenaraiBerantai; }
~TumpukanSenarai()
//destruktor
{ delete pSenarai; } //menghapus
senarai berantai
void push(double j) //menempatkan item ke atas tumpukan
{
pSenarai->sisipPertama(j); }
double pop() //menghapus item dari
atas tumpukan
{ return pSenarai->hapusPertama(); }
bool apaKosong() //true jika tumpukan
kosong
{ return ( pSenarai->apaKosong() );
}
void tampilTumpukan()
{
cout
<< "Tumpukan
(atas-->bawah): ";
pSenarai->tampilSenarai();
}
}; //akhir kelas TumpukanSenarai
int main()
{
TumpukanSenarai
tumpukan; //menciptakan tumpukan
tumpukan.push(20);
//menempatkan item ke atas tumpukan
tumpukan.push(40);
tumpukan.tampilTumpukan(); //menampilkan tumpukan (40, 20)
tumpukan.push(60); //menempatkan item ke atas tumpukan
tumpukan.push(80);
tumpukan.tampilTumpukan(); //menampilkan tumpukan (80,
60, 40, 20,)
tumpukan.pop();
//menghapus item dari atas tumpukan (80, 60)
tumpukan.pop();
tumpukan.tampilTumpukan(); //menampilkan tumpukan (40, 20)
getch();
return 0;
} //akhir main()
|
Tumpukan (atas-->bawah): 40 20
Tumpukan (atas-->bawah): 80 60 40 20
Tumpukan (atas-->bawah): 40 20
4.
Tulislah sebuah program C++ untuk merealisasikan
senarai berantai ganda.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
//senaraiBerantaiGanda.cpp
//Mendemonstrasikan senarai berantai ganda
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
//ptr ke
simpul berikutnya dalam senarai
Simpul*
pBrktnya;
Simpul(double d) : dData(d), pBrktnya(NULL)
//konstruktor
{ }
void tampilSimpul() //menampilkan
simpul
{ cout
<< dData << " "; }
}; //akhir kelas Simpul
class SenaraiBerantaiGanda
{
private:
Simpul*
pPertama; //ptr ke simpul pertama
Simpul*
pAkhir; //ptr ke simpul terakhir
public:
//konstruktor
SenaraiBerantaiGanda() : pPertama(NULL), pAkhir(NULL)
{ }
~SenaraiBerantaiGanda()
//destruktor
{ //
(menghapus semua simpul)
Simpul*
pSkrg = pPertama; //di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
Simpul* pTemp = pSkrg;
pSkrg
= pSkrg->pBrktnya;
delete pTemp;
}
}
bool apaKosong() //true jika tidak
ada simpul
{ return pPertama==NULL; }
void sisipPertama(double dd) //menyisipkan di depan
senarai
{
//menciptakan simpul baru
Simpul*
pSimpulBaru = new Simpul(dd);
if( apaKosong() ) //jika senarai
kosong,
pAkhir = pSimpulBaru;
pSimpulBaru->pBrktnya
= pPertama;
pPertama
= pSimpulBaru;
}
//menyisipkan
di akhir senarai
void sisipAkhir(double dd)
{
//menciptakan
simpul baru
Simpul*
pSimpulBaru = new Simpul(dd);
if( apaKosong() ) //jika senarai kosong,
pPertama = pSimpulBaru;
else
pAkhir->pBrktnya = pSimpulBaru;
pAkhir =
pSimpulBaru;
}
void hapusPertama() //menghapus
simpul pertama
{ //(diasumsikan
tak-kosong)
Simpul*
pTemp = pPertama; //mengingat simpul pertama
//jika
hanya ada satu simpul
if(pPertama->pBrktnya == NULL)
pAkhir = NULL; //NULL
<-- akhir
pPertama
= pPertama->pBrktnya;
delete pTemp; //menghapus
}
void tampilSenarai()
{
cout
<< "Senarai
(pertama-->akhir): ";
Simpul*
pSkrg = pPertama; //di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
pSkrg->tampilSimpul();
//menampilkan data
pSkrg
= pSkrg->pBrktnya; //ke simpul brktnya
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantaiGanda
int main()
{
SenaraiBerantaiGanda senarai; //menciptakan senarai baru
senarai.sisipPertama(22);
//menyisipkan di depan
senarai.sisipPertama(44);
senarai.sisipPertama(66);
senarai.sisipAkhir(11);
//menyisipkan di belakang
senarai.sisipAkhir(33);
senarai.sisipAkhir(55);
senarai.tampilSenarai();
//menampilkan senarai
cout <<
"Menghapus dua item pertama"
<< endl;
senarai.hapusPertama();
//menghapus dua item pertama
senarai.hapusPertama();
senarai.tampilSenarai();
//menampilkan kembali
getch();
return 0;
} //akhir main()
|
Senarai (pertama-->akhir): 66 44 22 11 33 55
Menghapus dua item pertama
Senarai (pertama-->akhir): 22 11 33 55
5.
Tulislah sebuah program C++ untuk menciptakan sebuah antrian
dengan senarai berantai.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
//senaraiBerantaiAntrian.cpp
//Mendemonstrasikan antrian
//yang diimplementasikan dengan senarai berantai
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
Simpul* pBrktnya;
//simpul berikutnya dalam senarai
Simpul(double
dd) : dData(dd), pBrktnya(NULL)
{ } //konstruktor
void tampilSimpul() //menampilkan
simpul
{ cout <<
dData << " "; }
}; //akhir kelas Simpul
class SenaraiBerantaiGanda
{
private:
Simpul*
pPertama; //ptr ke simpul pertama
Simpul*
pAkhir; //ptr ke simpul akhir
public:
//konstruktor
SenaraiBerantaiGanda() : pPertama(NULL), pAkhir(NULL)
{ }
~SenaraiBerantaiGanda() //destruktor
{ //
(menghapus semua simpul)
Simpul*
pSkrg = pPertama; //di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
Simpul* pTemp = pSkrg;
pSkrg
= pSkrg->pBrktnya;
delete
pTemp;
}
}
bool apaKosong() //true jika tidak
ada simpul
{ return pPertama==NULL; }
//menyisipkan
di akhir senarai
void sisipAkhir(double dd)
{
//menciptakan
simpul baru
Simpul*
pSimpulBaru = new Simpul(dd);
if( apaKosong() ) //jika kosong,
pPertama = pSimpulBaru;
else
pAkhir->pBrktnya = pSimpulBaru;
pAkhir =
pSimpulBaru;
}
double hapusPertama() //menghapus
simpul pertama
{ //(asumsi
senarai tak-kosong)
Simpul*
pTemp = pPertama; //mengingat simpul pertama
double temp = pPertama->dData;
//jika
hanya satu simpul
if(pPertama->pBrktnya == NULL)
pAkhir
= NULL;
pPertama
= pPertama->pBrktnya;
delete pTemp;
return temp;
}
void tampilSenarai()
{
Simpul*
pSkrg = pPertama; //di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
pSkrg->tampilSimpul(); //menampilkan data
pSkrg
= pSkrg->pBrktnya; //move to next Simpul
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantaiGanda
class SenaraiAntrian
{
private:
SenaraiBerantaiGanda senarai;
public:
bool apaKosong() //true jika antrian
kosong
{ return senarai.apaKosong(); }
void sisip(double j) //menyisipkan di belakang antrian
{
senarai.sisipAkhir(j); }
double hapus() //menghapus dari depan
antrian
{ return senarai.hapusPertama(); }
void tampilAntrian()
{
cout
<< "Antrian (depan-->belakang):
";
senarai.tampilSenarai();
}
}; //akhir kelas SenaraiAntrian
int main()
{
SenaraiAntrian
antrian; //menciptakan antrian
antrian.sisip(20);
//menyisipkan item
antrian.sisip(40);
antrian.tampilAntrian();
//menampilkan antrian (20, 40)
antrian.sisip(60);
//menyisipkan item
antrian.sisip(80);
antrian.tampilAntrian();
//menampilkan antrian (20, 40, 60, 80)
cout <<
"Menghapus dua item"
<< endl;
antrian.hapus();
//menghapus item (20, 40)
antrian.hapus();
antrian.tampilAntrian();
//menampilkan antrian (60, 80)
getch();
return 0;
} //akhir main()
|
Antrian (depan-->belakang): 20 40
Antrian (depan-->belakang): 20 40 60 80
Menghapus dua item
Antrian (depan-->belakang): 60 80
6.
Tulislah sebuah program C++ untuk menciptakan sebuah
senarai berantai terurut.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
//senaraiTerurut.cpp
//Mendemonstrasikan senarai terurut
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
Simpul*
pBrktnya; //simpul berikutnya dalam senarai
Simpul(double dd) : dData(dd),
pBrktnya(NULL) //konstruktor
{ }
void tampilSimpul() //menampilkan
simpul
{ cout
<< dData << " "; }
}; //akhir kelas Simpul
class SenaraiTerurut
{
private:
Simpul*
pPertama; //ptr ke simpul pertama
public:
SenaraiTerurut() : pPertama(NULL) //konstruktor
{ }
~SenaraiTerurut()
//destruktor
{ //
(menghapus simpul-simpul)
Simpul*
pSkrg = pPertama; //mulai di awal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
Simpul* pLama = pSkrg; //menyimpan simpul sekarang
pSkrg
= pSkrg->pBrktnya; //ke simpul brktnya
delete pLama;
}
}
bool apaSekarang() //true jika tidak
simpul
{ return (pPertama==NULL); }
void sisip(double kunci) //menyisipkan secara berurutan
{
//menciptakan simpul baru
Simpul*
pSimpulBaru = new Simpul(kunci);
Simpul*
pSblmnya = NULL; //mulai di awal
senarai
Simpul*
pSkrg = pPertama;
//sampai
akhir senarai,
while(pSkrg != NULL && kunci > pSkrg->dData)
{ //atau
kunci > sekarang,
pSblmnya = pSkrg;
pSkrg
= pSkrg->pBrktnya; //ke item berikutnya
}
if(pSblmnya==NULL) //di awal senarai
pPertama = pSimpulBaru;
else //tidak di awal senarai
pSblmnya->pBrktnya = pSimpulBaru;
pSimpulBaru->pBrktnya = pSkrg;
} //akhir
sisip()
void hapus() //menghapus simpul
pertama
{
//(diasumsikan senarai tak-kosong)
Simpul*
pTemp = pPertama; //simpan simpul pertama
pPertama
= pPertama->pBrktnya;
delete pTemp;
}
void tampilSenarai()
{
cout
<< "Senarai (pertama-->akhir): ";
Simpul*
pSkrg = pPertama;
while(pSkrg != NULL)
{
pSkrg->tampilSimpul();
pSkrg
= pSkrg->pBrktnya;
}
cout
<< endl;
}
}; //akhir kelas SenaraiTerurut
int main()
{
SenaraiTerurut
senaraiTerurut; //menciptakan senarai baru
senaraiTerurut.sisip(20);
//menyisipkan 2 item
senaraiTerurut.sisip(40);
senaraiTerurut.tampilSenarai();
//menampilkan senarai (20, 40)
senaraiTerurut.sisip(10);
//menyisipkan 3 item lagi
senaraiTerurut.sisip(30);
senaraiTerurut.sisip(50);
//menampilkan
senarai (10, 20, 30, 40, 50)
senaraiTerurut.tampilSenarai();
senaraiTerurut.hapus();
//menghapus elemen terkecil
//menampilkan
senarai (20, 30, 40, 50)
senaraiTerurut.tampilSenarai();
getch();
return 0;
} //akhir main()
|
Senarai (pertama-->akhir): 20 40
Senarai (pertama-->akhir): 10 20 30 40 50
Senarai (pertama-->akhir): 20 30 40 50
7.
Tulislah sebuah program C++ yang merealisasikan
pengurutan penyusutan dengan senarai berantai.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
//senaraiPengurutanPenyisipan.cpp
//Mendemonstrasikan senarai berantai terurut untuk
pengurutan
#include
<iostream>
#include
<cstdlib>
#include
<ctime>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
Simpul*
pBrktnya; //simpul berikutnya pada senarai
//konstruktor
Simpul(double dd) : dData(dd),
pBrktnya(NULL)
{ }
}; //akhir kelas Simpul
class SenaraiTerurut
{
private:
Simpul*
pPertama; //ptr ke item pertama pada senarai
public:
//konstruktor
tanpa-argumen
SenaraiTerurut() : pPertama(NULL)
{ }
//menginisialisasi senarai
//konstruktor
SenaraiTerurut(Simpul** arrSimpul, int panjang) : pPertama(NULL)
{
//(diinisialisasi dengan array)
for(int j=0; j<panjang; j++) //menyalin array
sisip( arrSimpul[j] ); //ke senarai
}
void sisip(Simpul* pArg)
//menyisipkan scr berurutan
{
Simpul*
pSblmnya = NULL; //di awal senarai
Simpul*
pSkrg = pPertama;
//sampai
akhir senarai,
while(pSkrg != NULL && pArg->dData > pSkrg->dData)
{ //atau
kunci > simpul skrg,
pSblmnya = pSkrg;
pSkrg
= pSkrg->pBrktnya; //ke item brktnya
}
if(pSblmnya==NULL) //di awal senarai
pPertama = pArg; //pertama --> k
else //tidak di awal senarai
pSblmnya->pBrktnya = pArg;
pArg->pBrktnya = pSkrg;
} //akhir
sisip()
Simpul*
hapus() //menghasilkan dan menghapus simpul pertama
{ //(asumsi
senarai tak-kosong)
Simpul*
pTemp = pPertama;
pPertama
= pPertama->pBrktnya;
return pTemp; //menghasilkan nilai
}
}; //akhir kelas SenaraiTerurut
int main()
{
int j;
time_t watkuA;
//tunas bilangan acak
srand(static_cast<unsigned>(time(&watkuA))
);
const int ukuran = 10; //ukuran array
//array yang
memuat
Simpul*
arraySenarai[ukuran];
//mengisi dengan
pointer-pointer ke simpul-simpul
for(j=0; j<ukuran; j++)
{
int n = rand() % 99; //angka acak (0
sampai 99)
Simpul*
pSimpulBaru = new Simpul(n);
//menciptakan Simpul
//menempatkan
ptr ke Simpul dalam array
arraySenarai[j] = pSimpulBaru;
}
cout <<
"Array tak-terurut: ";
//menampilkan isi array
for(j=0; j<ukuran; j++)
cout <<
arraySenarai[j]->dData << " ";
cout <<
endl;
//menciptakan
senarai baru
//diinisialisasi
dengan array
SenaraiTerurut
senaraiTerurut(arraySenarai, ukuran);
for(j=0; j<ukuran; j++)
arraySenarai[j] = senaraiTerurut.hapus();
cout <<
"Array terurut: ";
//menampilkan isi array
for(j=0; j<ukuran; j++)
cout <<
arraySenarai[j]->dData << " ";
cout <<
endl;
for(j=0; j<ukuran; j++)
//menghapus simpul-simpul
delete arraySenarai[j];
getch();
return 0;
} //akhir main()
|
Array tak-terurut: 41 18 60 18 29 75 57 28 93
14
Array terurut: 14 18 18 28 29 41 57 60 75 93
8.
Tulislah sebuah program C++ untuk merealisasikan
senarai berantai ganda.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
//senaraiBerantaiGandaLengkap.cpp
//Mendemonstrasikan senarai berantai ganda
#include
<iostream>
#include
<conio.h>
using namespace std;
class Simpul
{
public:
double dData; //item data
Simpul*
pBrktnya; //simpul berikutnya pada senarai
Simpul*
pSblmnya; //simpul sbmnya pada senarai
public:
Simpul(double dd) : //konstruktor
dData(dd),
pBrktnya(NULL), pSblmnya(NULL)
{ }
void tampilSenarai() //menampilkan
simpull
{ cout
<< dData << " "; }
}; //akhir kelas Simpul
class SenaraiBerantaiGanda
{
private:
Simpul*
pPertama; //pointer ke item pertama
Simpul*
pAkhir; //pointer ke item terakhir
public:
SenaraiBerantaiGanda()
: //konstruktor
pPertama(NULL), pAkhir(NULL)
{ }
~SenaraiBerantaiGanda()
//destruktor (menghapus simpul)
{
Simpul*
pSkrg = pPertama; //mulai diawal senarai
while(pSkrg != NULL) //sampai akhir senarai,
{
Simpul* pLama = pSkrg;
pSkrg
= pSkrg->pBrktnya;
delete pLama;
}
}
bool apaKosong() //true jika tidak
ada simpul
{ return pPertama==NULL; }
//menyisipkan
di awal senarai
void sisipPertama(double dd)
{
//menciptakan
simpul baru
Simpul* pSimpulBaru = new Simpul(dd);
if( apaKosong() ) //jika senarai
kosong,
pAkhir = pSimpulBaru;
else
pPertama->pSblmnya = pSimpulBaru;
pSimpulBaru->pBrktnya = pPertama;
pPertama = pSimpulBaru;
}
void sisipAkhir(double dd)
//menyisipkan di akhir senarai
{
//menciptakan
simpul baru
Simpul*
pSimpulBaru = new Simpul(dd);
if( apaKosong() )
pPertama = pSimpulBaru;
else
{
pAkhir->pBrktnya = pSimpulBaru;
pSimpulBaru->pSblmnya = pAkhir;
}
pAkhir =
pSimpulBaru;
}
void hapusPertama()
{ //(asumsi
senarai-kosong)
Simpul*
pTemp = pPertama;
if(pPertama->pBrktnya == NULL)
pAkhir = NULL;
else
pPertama->pBrktnya->pSblmnya = NULL;
pPertama = pPertama->pBrktnya;
delete pTemp;
}
void hapusAkhir()
{ //(asumsi
senarai-kosong)
Simpul*
pTemp = pAkhir;
if(pPertama->pBrktnya == NULL)
pPertama = NULL;
else
pAkhir->pSblmnya->pBrktnya = NULL;
pAkhir =
pAkhir->pSblmnya;
delete pTemp;
}
//menyisipkan
tepat setelah kunci
bool sisipSetelah(double kunci, double dd)
{ //(asumsi
senarai-kosong)
Simpul*
pSkrg = pPertama;
while(pSkrg->dData != kunci)
{
pSkrg
= pSkrg->pBrktnya;
if(pSkrg == NULL)
return false;
}
Simpul*
pSimpulBaru = new Simpul(dd);
if(pSkrg==pAkhir)
{
pSimpulBaru->pBrktnya
= NULL;
pAkhir = pSimpulBaru;
}
else
{
pSimpulBaru->pBrktnya = pSkrg->pBrktnya;
pSkrg->pBrktnya->pSblmnya = pSimpulBaru;
}
pSimpulBaru->pSblmnya
= pSkrg;
pSkrg->pBrktnya = pSimpulBaru;
return true;
}
bool hapusKunci(double kunci)
{ //(asumsi
senarai-kosong)
Simpul*
pSkrg = pPertama;
while(pSkrg->dData != kunci)
{
pSkrg
= pSkrg->pBrktnya;
if(pSkrg == NULL)
return false;
}
if(pSkrg==pPertama)
pPertama = pSkrg->pBrktnya;
else
pSkrg->pSblmnya->pBrktnya = pSkrg->pBrktnya;
if(pSkrg==pAkhir)
pAkhir = pSkrg->pSblmnya;
else
pSkrg->pBrktnya->pSblmnya = pSkrg->pSblmnya;
delete pSkrg;
return true;
}
void tampilMaju()
{
cout
<< "Senarai (pertama-->akhir): ";
Simpul*
pSkrg = pPertama;
while(pSkrg != NULL)
{
pSkrg->tampilSenarai();
pSkrg
= pSkrg->pBrktnya;
}
cout
<< endl;
}
void tampilMundur()
{
cout
<< "Senarai
(akhir-->pertama): ";
Simpul*
pSkrg = pAkhir;
while(pSkrg != NULL)
{
pSkrg->tampilSenarai();
pSkrg
= pSkrg->pSblmnya;
}
cout
<< endl;
}
}; //akhir kelas SenaraiBerantaiGanda
int main()
{
SenaraiBerantaiGanda senarai; //menciptakan senarai baru
senarai.sisipPertama(22);
//menyisipkan di depan
senarai.sisipPertama(44);
senarai.sisipPertama(66);
senarai.sisipAkhir(11);
//menyisipkan di belakang
senarai.sisipAkhir(33);
senarai.sisipAkhir(55);
senarai.tampilMaju();
//menampilkan senarai secara maju
senarai.tampilMundur(); //menampilkan senarai secara mundur
cout <<
"Menghapus simpul pertama,
simpul akhir, dan 11"
<< endl;
senarai.hapusPertama();
senarai.hapusAkhir();
senarai.hapusKunci(11);
senarai.tampilMaju();
//menampilkan senarai secara maju
cout <<
"Menyisipkan 77 setelah
simpul 22, dan 88 setelah 33" << endl;
senarai.sisipSetelah(22, 77);
senarai.sisipSetelah(33, 88);
senarai.tampilMaju(); //menampilkan senarai secara maju
getch();
return 0;
} //akhir main()
|
Senarai (pertama-->akhir): 66 44 22 11 33 55
Senarai (akhir-->pertama): 55 33 11 22 44 66
Menghapus simpul pertama, simpul akhir, dan 11
Senarai (pertama-->akhir): 44 22 33
Menyisipkan 77 setelah simpul 22, dan 88
setelah 33
Senarai (pertama-->akhir): 44 22 77 33 88
No comments:
Post a Comment