









Preview text:
DS LIÊN KẾT scanf ("%d",&X); #include ThemXTruocChanDau(&ds,X); #include
printf ("\nDanh sach sau khi them vao truoc pt chan : ");
// dinh nghia cau truc danh sach lien ket output(ds); struct ttNode{ //Cau 7 int data;
printf ("\nNhap gia tri can them vao sau pt le: struct ttNode *pNext; "); }; scanf ("%d",&X); typedef struct ttNode Node; ThemXSauLeCuoi(&ds,X); struct ttList{
printf ("\nDanh sach sau khi them vao sau pt le Node *pHead, *pTail; : "); }; output(ds); typedef struct ttList List; //Cau 8
Node *minNode= TimMin(&ds); //khai bao cac nguyen mau ham if(minNode!=NULL){ void init(List *l);
printf ("\nGia tri nho nhat la: %d\n", int isEmpty(List *l); minNode->data);
void addHead(List *l,Node *pNew);
void addTail(List *l,Node *pNew);
} else printf("\nDanh sach rong"); Node * createNode(int x); SapXep(&ds); …
printf("\nDanh sach sau khi sx tang la: "); output(ds); //cai dat ham main // Xóa phan tu dau
int main(int argc, char *argv[]) { XoaDau(&ds); List ds;
printf("\nDs sau khi xoa phan tu dau:\n"); init(&ds); output(ds); input(&ds);
printf("Danh sach sau khi nhap :\n"); // Xóa phan tu cuoi output(ds); XoaCuoi(&ds); //Cau 3
printf("\nDanh sach sau khi xoa phan tu cuoi:\n");
printf("\nPhan tu mang gia tri chan la :"); output(ds); XuatChan(&ds); //cau 4 // Xóa phan tu giua
Node *maxNode= TimMax(&ds); if(maxNode!=NULL){ XoaGiua(&ds);
printf ("\nGia tri lon nhat la: %d\n",
printf("\nDanh sách sau khi xóa giua la: "); maxNode->data); output(ds);
} else printf("\nDanh sach rong"); //Cau 5 //Xoa Min int demSNT= DemSNT(&ds); XoaMin(&ds);
printf ("\nSo luong so nguyen to la: %d\
printf("\nDanh sach sau khi xoa min %d la:\ n",demSNT); n"); output(ds); //Cau 6 // Nhap X va xoa truoc sau X int X;
printf ("Nhap gia tri can them vao truoc pt
printf("Nhap gia tri X de xoa truoc va sau X: "); chan: "); scanf("%d", &X); 1 XoaTruocSauX(&ds, X);
printf("Danh sach sau khi xoa truoc va sau X:\n"); Node * createNode(int x){ output(ds); Node *p;
p = (Node *)malloc(sizeof(Node));
// // Tach danh sach thanh 2 danh sach if(p == NULL){
// Tach(ds, &dsNguyenTo, &dsConLai);
printf("Khong du bo nho cap phat.\n");
// printf("Danh sach cac so nguyen to:\n"); }else{ // output(dsNguyenTo); p->data = x;
// printf("Danh sach cac phan tu con lai:\n"); p->pNext = NULL; // output(dsConLai); } return p;
printf("Nhap gia tri X de xoa cac phan tu co gia tri } bang X: "); scanf("%d", &X); void input(List *l){ XoaX(&ds, X); init(l);
printf("Danh sach sau khi xoa cac phan tu bang int x; %d:\n", X); Node *pNew; output(ds); do{ printf("Hay nhap pt :"); return 0; scanf("%d",&x); } if(x == 0) break;
//cai dat cac thao tac cua DSLK pNew = createNode(x); void init(List *l){ if(pNew != NULL){
l->pHead = l->pTail = NULL; addTail(l,pNew); } } }while(1); int isEmpty(List *l){ }
return ((l->pHead == NULL) && (l->pTail == NULL)) ? 1 : 0; } void output(List l){ Node *p = l.pHead;
void addHead(List *l,Node *pNew){ while(p!=NULL){ if(isEmpty(l)){ printf("%d\t",p->data);
l->pHead = l->pTail = pNew; p = p->pNext; }else{ } pNew->pNext = l->pHead; printf("\n"); l->pHead = pNew; } } //Cau 3 } void XuatChan(List *l){ Node *p= l -> pHead;
void addTail(List *l,Node *pNew){ while(p){ if(isEmpty(l)){ if(p->data %2 ==0)
l->pHead = l->pTail = pNew; printf (" %d\t", p->data); }else{ p= p->pNext; l->pTail->pNext = pNew; } l->pTail = pNew; } } } //Cau 4 2 Node * TimMax(List *l){ prev=q; Node *pmax= l->pHead; break;
Node *p= l->pHead->pNext; } for(;p;p=p->pNext){ }
if(p->data > pmax->data) if(prev!=NULL){ pmax=p; prev->pNext=k; } k->pNext=p; return pmax; } } }
void ThemXTruocChanDau(List *l, int X){ //Cau 5 Node *k = createNode(X); int LaSNT(int x){ Node *p= TimChanDau(l); if(x<2) return 0; if(p==NULL){ int i; addHead(l,k); for(i=2;i*i<=x;i++){ } if(x%i==0) return 0; else } ThemkTruocp(l,p,k); return 1; } } //Cau 7 int DemSNT(List *l){ Node * TimLeCuoi(List *l){ int dem=0; Node *p= l->pHead; Node *p=l->pHead;
for(;p!= NULL; p=p->pNext){ Node * pLeCuoi=NULL; if(LaSNT(p->data)) while(p!=NULL){ dem++; if(p->data %2!=0){ } pLeCuoi=p; return dem; } } p=p->pNext; //Cau 6 } Node * TimChanDau(List *l){ return pLeCuoi; Node *p=l->pHead; } for(;p!=NULL;p=p->pNext){
void ThemkSaup(List *l, Node *p, Node *k){ if(p->data %2==0){ k-> pNext= p->pNext; return p; p->pNext=k; } } }
void ThemXSauLeCuoi(List *l, int X){ return NULL; Node *k= createNode(X); } Node *p= TimLeCuoi(l);
void ThemkTruocp(List *l, Node *p, Node *k){ if(p==NULL){ if(l->pHead==NULL) return; addTail(l,k); if(p==l->pHead){ k->pNext=l->pHead; } l->pHead=k; else ThemkSaup(l,p,k); return; } } //Cau 8 Node *prev=NULL; Node * TimMin(List *l){ Node *q= l->pHead;
if(l->pHead==NULL) return NULL; for(;q;q=q->pNext){ Node * pMin= l->pHead; if(q->pNext==p){
Node *p= l->pHead->pNext; 3 for(;p;p=p->pNext){ void XoaMin(List *l) {
if(p->data < pMin->data){ if (isEmpty(l)) { pMin=p;
printf("Danh sach rong, khong the xoa!\n"); return; } } } return pMin; Node *minNode = TimMin(l); } if (minNode == l->pHead) {
XoaDau(l); // N?u ph?n t? nh? nh?t là ph?n t? d? u tiên
// Ham xoa phan tu dau tien trong danh sach return; void XoaDau(List *l) { } if (isEmpty(l)) {
printf("Danh sach rong, khong the xoa!\n"); Node *prev = NULL; return; Node *p = l->pHead; }
// Duy?t d?n khi tìm th?y ph?n t? minNode
while (p != NULL && p != minNode) { Node* temp = l->pHead; prev = p;
l->pHead = l->pHead->pNext; p = p->pNext; free(temp); } if (prev != NULL) {
// N?u danh sách tr? nên r?ng
prev->pNext = minNode->pNext; if (l->pHead == NULL) { } l->pTail = NULL; if (minNode == l->pTail) { }
l->pTail = prev; // C?p nh?t pTail n?u minNode } là ph?n t? cu?i }
// Ham xoa phan tu cuoi cung trong danh sach free(minNode); void XoaCuoi(List *l) { }
if (l->pHead == NULL) return; // Danh sách r?ng void XoaGiua(List *l) {
if (l->pHead->pNext == NULL) { // Ch? có 1 ph?n if (isEmpty(l)) { t?
printf("Danh sach rong, khong the xoa!\n"); free(l->pHead); return; l->pHead = NULL; } } else { Node *prev = NULL;
// Neu danh sach chi co 1 phan tu thi chi can xoa Node *p = l->pHead; dau while (p->pNext != NULL) {
if (l->pHead == l->pTail) { prev = p; XoaDau(l); p = p->pNext; return; } } free(p); prev->pNext = NULL;
// Buoc 1: Tim do dai cua danh sach } int length = 0; } Node *p = l->pHead; while (p != NULL) { length++; p = p->pNext;
// Ham xoa phan tu co gia tri nho nhat } 4 } else {
// Buoc 2: Tim vi tri phan tu o giua prev = p; int midPos = length / 2; p = p->pNext; }
// Buoc 3: Duyet den vi tri giua va xoa phan tu } Node *prev = NULL; } p = l->pHead; int i;
// Ham xoa tat ca cac so le trong danh sach
for ( i = 0; i < midPos; i++) { prev = p; p = p->pNext;
// Ham xoa tat ca cac so nguyen to trong danh sach } void XoaSoNguyenTo(List *l) { if (isEmpty(l)) return;
// Neu `prev` khong NULL, nghia la phan tu can
xoa khong phai phan tu dau tien
// Xoa phan tu dau tien neu la so nguyen to if (prev != NULL) {
while (l->pHead != NULL && LaSNT(l->pHead- prev->pNext = p->pNext; >data)) { } XoaDau(l); } // Cap nhat `pTail` neu can if (p == l->pTail) { Node *prev = l->pHead; l->pTail = prev;
Node *p = (l->pHead != NULL) ? l->pHead- } >pNext : NULL;
// Giai phong bo nho cho phan tu giua while (p != NULL) { free(p); if (LaSNT(p->data)) { } prev->pNext = p->pNext;
// Ham xoa tat ca cac so chan trong danh sach if (p == l->pTail) { void XoaSoChan(List *l) { l->pTail = prev; if (isEmpty(l)) return; } free(p);
// Xoa phan tu dau tien neu la so chan p = prev->pNext;
while (l->pHead != NULL && l->pHead->data % } else { 2 == 0) { prev = p; XoaDau(l); p = p->pNext; } } } Node *prev = l->pHead; }
Node *p = (l->pHead != NULL) ? l->pHead- void Xoap(List *l, Node *p) { >pNext : NULL;
if (isEmpty(l) || p == NULL) return; while (p != NULL) {
// N?u node p là node d?u tiên if (p->data % 2 == 0) { if (p == l->pHead) { prev->pNext = p->pNext; XoaDau(l); if (p == l->pTail) { return; l->pTail = prev; } } free(p); // N?u node p là node cu?i p = prev->pNext; if (p == l->pTail) { 5 Node *prev = l->pHead;
if (prev == NULL) { // cur là node d?u tiên while (prev->pNext != p) { l->pHead = p; prev = prev->pNext; } else { } prev->pNext = p; prev->pNext = NULL; } l->pTail = prev; free(cur); free(p); } return; }
void XoakSaup(List *l, Node *p) {
if (p == NULL | p->pNext == NULL) { // Xóa node p ? gi?a
printf("Khong co node sau hoac node sau khong Node *prev = l->pHead; ton tai!\n"); while (prev->pNext != p) {
return; // Không có node nào sau p ho?c p là ph? prev = prev->pNext; n t? cu?i cùng } } prev->pNext = p->pNext; free(p); Node *q = p->pNext; }
p->pNext = q->pNext; // Liên k?t p v?i node sau Node *TimX(List l, int X) { node q Node *p = l.pHead; while (p != NULL) { if (q == l->pTail) {
if (p->data == X) return p;
l->pTail = p; // C?p nh?t node cu?i n?u q là ph?n p = p->pNext; t? cu?i } }
return NULL; // Không tìm th?y }
free(q); // Gi?i phóng node q
void XoakTruocp(List *l, Node *p) { }
if (p == l->pHead || isEmpty(l)) {
printf("Khong co node truoc hoac danh sach
void XoaTruocSauX(List *l, int X) { rong!\n"); Node *pX = TimX(*l, X);
return; // Không có node nào tru?c p ho?c danh if (pX == NULL) { sách r?ng
printf("Khong tim thay phan tu %d trong danh } sach\n", X); return; Node *prev = NULL; } Node *cur = l->pHead; // Xóa ph?n t? tru?c pX // Tìm node tru?c node p XoakTruocp(l, pX);
while (cur->pNext != p && cur != NULL) { prev = cur; // Xóa ph?n t? sau pX cur = cur->pNext; XoakSaup(l, pX); } } void XoaX(List *l, int X) {
// Xóa node cur (node tru?c node p) if (isEmpty(l)) return; if (cur == NULL) {
printf("Khong the xoa node truoc!\n"); Node *p = l->pHead; return; Node *prev = NULL; }
// Duy?t qua danh sách liên k?t 6 while (p != NULL) { Node *q = p->pNext; if (p->data == X) {
for (; p != NULL; p = p->pNext) {
// N?u node c?n xóa là node d?u
for (; q != NULL; q = q->pNext) { if (p == l->pHead) {
if (p->data > q->data) {
l->pHead = p->pNext; // C?p nh?t l?i node
// Hoán d?i giá tr? c?a 2 node d?u int temp = p->data; free(p); p->data = q->data;
p = l->pHead; // Ti?p t?c duy?t t? node d?u q->data = temp; m?i } } }
// N?u node c?n xóa là node gi?a ho?c cu?i } else { } prev->pNext = p->pNext;
Bài về SV
if (p == l->pTail) { // N?u p là node cu?i // Cấu trúc sinh viên l->pTail = prev; typedef struct { } char MSSV[10]; free(p); char HoTen[50];
p = prev->pNext; // Ti?p t?c duy?t t? node char GioiTinh[10]; ti?p theo char DiaChi[100]; } float DiemTB; } } SinhVien; else { prev = p;
// Node chứa thông tin sinh viên
p = p->pNext; // Chuy?n sang node ti?p theo typedef struct NODE { } SinhVien data; } struct NODE *pNext; } } NODE;
void Tach(List l, List *l1, List *l2) {
// Danh sách liên kết chứa các sinh viên init(l1); typedef struct { init(l2); NODE *pHead; } LIST; Node *p = l.pHead; while (p != NULL) {
// Tạo node mới cho danh sách sinh viên int k = p->data; NODE* TaoNode(SinhVien sv) { Node *pAdd = createNode(k); NODE *newNode = (NODE*) malloc(sizeof(NODE)); if (LaSNT(k)) {
if (newNode == NULL) return NULL;
addHead(l1, pAdd); // Thêm vào danh sách s? newNode->data = sv; nguyên t? newNode->pNext = NULL; } else { return newNode;
addHead(l2, pAdd); // Thêm vào danh sách } còn l?i }
// Thêm sinh viên vào cuối danh sách p = p->pNext;
void ThemCuoi(LIST &l, NODE *p) { } if (l.pHead == NULL) { } l.pHead = p; void SapXep(List *l) { } else { Node *p = l->pHead; 7 NODE *tail = l.pHead; return;
while (tail->pNext != NULL) { } tail = tail->pNext; prev = p; } p = p->pNext; tail->pNext = p; } }
printf("Khong tim thay sinh vien voi MSSV: %s\n", } MSSV); }
// Hàm thêm một sinh viên vào danh sách
void ThemSinhVien(LIST &l) {
// Hàm sắp xếp danh sách sinh viên theo điểm trung SinhVien sv; bình printf("Nhap MSSV: ");
void SapXepTheoDiemTB(LIST &l) { scanf("%s", sv.MSSV);
for (NODE *p = l.pHead; p != NULL; p = p- printf("Nhap ho va ten: "); >pNext) { scanf(" %[^\n]", sv.HoTen);
for (NODE *q = p->pNext; q != NULL; q = q- printf("Nhap gioi tinh: "); >pNext) { scanf("%s", sv.GioiTinh);
if (p->data.DiemTB > q->data.DiemTB) { printf("Nhap dia chi: "); SinhVien temp = p->data; scanf(" %[^\n]", sv.DiaChi); p->data = q->data;
printf("Nhap diem trung binh: "); q->data = temp; scanf("%f", &sv.DiemTB); } } NODE *newNode = TaoNode(sv); } ThemCuoi(l, newNode); } }
// Hàm liệt kê các sinh viên có điểm trung bình >= 5.0
// Hàm in danh sách sinh viên
void LietKeSinhVienDiemTB(LIST l) {
void InDanhSachSinhVien(LIST l) { NODE *p = l.pHead; NODE *p = l.pHead; while (p != NULL) { while (p != NULL) {
if (p->data.DiemTB >= 5.0) {
printf("MSSV: %s, Ho va ten: %s, Gioi tinh: %s,
printf("MSSV: %s, Ho va ten: %s, Gioi tinh:
Dia chi: %s, Diem TB: %.2f\n",
%s, Dia chi: %s, Diem TB: %.2f\n",
p->data.MSSV, p->data.HoTen, p-
p->data.MSSV, p->data.HoTen, p-
>data.GioiTinh, p->data.DiaChi, p->data.DiemTB);
>data.GioiTinh, p->data.DiaChi, p->data.DiemTB); p = p->pNext; } } p = p->pNext; } } }
// Hàm xóa một sinh viên theo MSSV
void XoaSinhVien(LIST &l, char *MSSV) {
// Hàm đếm số lượng sinh viên nam
NODE *prev = NULL, *p = l.pHead; int DemSoLuongNam(LIST l) { while (p != NULL) { int count = 0;
if (strcmp(p->data.MSSV, MSSV) == 0) { NODE *p = l.pHead; if (prev == NULL) { while (p != NULL) { l.pHead = p->pNext;
if (strcmp(p->data.GioiTinh, "Nam") == 0) { } else { count++; prev->pNext = p->pNext; } } p = p->pNext; free(p); } 8 return count; newNode->key = key; } newNode->demi = 1; newNode->pNext = NULL;
// Hàm cập nhật điểm trung bình của một sinh viên return newNode; thông qua MSSV }
void CapNhatDiemTB(LIST &l, char *MSSV, float newDiemTB) {
// Thêm một node vào cuối danh sách NODE *p = l.pHead;
void ThemCuoi(List *l, Node *p) { while (p != NULL) { if (l->pHead == NULL) {
if (strcmp(p->data.MSSV, MSSV) == 0) { l->pHead = p;
p->data.DiemTB = newDiemTB; l->pTail = p; return; } else { } l->pTail->pNext = p; p = p->pNext; l->pTail = p; } }
printf("Khong tim thay sinh vien voi MSSV: %s\n", } MSSV); }
// Tìm node chứa ký tự `key` trong danh sách, nếu tìm
thấy trả về con trỏ đến node đó, nếu không thì trả về
Có them thuộc tính đếm và phát NULL
Node* TimKiem(List *l, char key) {
sinh ngẫu nhiên Node *p = l->pHead; while (p != NULL) { #include if (p->key == key) { #include return p; #include } p = p->pNext; typedef struct ttNode { } char key;
// Ký tự từ 'A' đến 'Z' return NULL; int demi;
// Số lần xuất hiện của ký tự }
struct ttNode *pNext; // Con trỏ đến node tiếp
Phát sinh ngẫu nhiên chữ từ A-Z theo
void PhatSinhNgauNhienKyTu(List *l) { } Node; srand(time(0));
for (int i = 0; i < 100; i++) { typedef struct {
char randomChar = 'A' + rand() % 26; // Sinh ký Node *pHead;
tự ngẫu nhiên từ 'A' đến 'Z' Node *pTail;
Node *p = TimKiem(l, randomChar); // Kiểm } List;
tra xem ký tự đã xuất hiện trong danh sách chưa if (p != NULL) {
// Khởi tạo danh sách rỗng
p->demi++; // Nếu đã có thì tăng số lần xuất void InitList(List *l) { hiện l->pHead = NULL; } else { l->pTail = NULL;
Node *newNode = TaoNode(randomChar); } ThemCuoi(l, newNode); }
// Tạo một node mới với ký tự và số lần xuất hiện là 1 } Node* TaoNode(char key) { }
Node *newNode = (Node*) malloc(sizeof(Node));
Phát sinh ngẫu nhiên số tù 0-100
if (newNode == NULL) return NULL;
void PhatSinhNgauNhienSo(List *l) { 9 srand(time(0)); curr = next;
// Tiến curr lên vị trí của next
for (int i = 0; i < 100; i++) { }
int randomNum = rand() % 101; // Sinh số ngẫu nhiên từ 0 đến 100
l->pHead = prev; // Đặt pHead thành prev (vì prev
// int Ran= rand() % (1000-1+1)+1; (số từ 1-1000
sẽ là nút cuối cùng đã duyệt qua) ngẫu nhiên) }
Node *p = TimKiem(l, randomNum); // Kiểm int main() {
tra xem số đã xuất hiện trong danh sách chưa List ds; if (p != NULL) { InitList(&ds);
p->demi++; // Nếu đã có thì tăng số lần xuất hiện
// a. Phát sinh ngẫu nhiên 100 ký tự từ A->Z } else {
PhatSinhNgauNhienKyTu(&ds);
Node *newNode = TaoNode(randomNum); ThemCuoi(l, newNode);
// b.1. Hiển thị danh sách với số lần xuất hiện của } mỗi ký tự }
printf("Danh sach cac ky tu va so lan xuat hien:\ } n");
void HienThiDanhSach(List l) { HienThiDanhSach(ds); Node *p = l.pHead; while (p != NULL) {
// b.2. Tìm phần tử xuất hiện nhiều nhất
printf("Ky tu: %c, So lan xuat hien: %d\n", p- Node *maxNode = TimMax(ds); >key, p->demi);
printf("\nKy tu xuat hien nhieu nhat: %c voi %d p = p->pNext;
lan\n", maxNode->key, maxNode->demi); } }
// b.3. Đảo ngược danh sách Node* TimMax(List l) { DaoNguocDanhSach(&ds); Node *pMax = l.pHead;
printf("\nDanh sach sau khi dao nguoc:\n"); Node *p = l.pHead->pNext; HienThiDanhSach(ds); while (p != NULL) {
if (p->demi > pMax->demi) { return 0; pMax = p; } } p = p->pNext; } return pMax; }
void DaoNguocDanhSach(List *l) { Node *prev = NULL; Node *curr = l->pHead; Node *next = NULL;
l->pTail = l->pHead; // Đầu tiên đặt pTail là pHead
(vì nó sẽ là nút cuối sau khi đảo) while (curr != NULL) {
next = curr->pNext; // Lưu lại nút tiếp theo
curr->pNext = prev; // Đảo con trỏ pNext của
nút hiện tại để trỏ về nút trước đó prev = curr;
// Tiến prev lên vị trí của curr 10