Dưới đây là 1 bài về danh sách đặc. Nhập xuất xóa chèn, có thêm 2 hàm chuyển danh sách đặc qua liên kết và ngược lại. 2 thuật toán tìm kiếm bằng đệ quy và không đệ quy. Mã: #include<iostream> #include<conio.h> #include<stdio.h> #include<string.h> #define max 10 using namespace std; typedef struct { char ten[30],masv[10]; int tuoi; float diem; }danhsach; typedef struct node { char masv[10]; node *link; }dslk; typedef struct { char masv[10]; }dsd; void nhap(danhsach sv[], int &n) { cout<<"\nNhap so sinh vien: "; cin>>n;cin.get(); for(int i=0;i<n;i++) { cout<<"\nNhap sv thu: "<<i+1; cout<<"\nNhap ten: "; cin>>sv[i].ten;cin.get(); cout<<"\nNhap masv: "; cin>>sv[i].masv;cin.get(); cout<<"\nNhap tuoi: "; cin>>sv[i].tuoi;cin.get(); cout<<"\nNhap diem: "; cin>>sv[i].diem;cin.get(); } } void xuat(danhsach sv[],int n) { cout<<"\nTen\tMa sv\tTuoi\tDiem\n"; for(int i=0;i<n;i++) { cout<<sv[i].ten<<"\t"<<sv[i].masv<<"\t"<<sv[i].tuoi<<"\t"<<sv[i].diem<<"\n"; } } void chen(danhsach sv[],int &n) { if(n<max) { danhsach tmp[1]; int x; cout<<"\nNhap gia tri can chen"; cout<<"\nNhap ten: "; cin>>tmp[0].ten;cin.get(); cout<<"\nNhap masv: "; cin>>tmp[0].masv;cin.get(); cout<<"\nNhap tuoi: "; cin>>tmp[0].tuoi; cin.get(); cout<<"\nNhap diem: "; cin>>tmp[0].diem; cin.get(); cout<<"\nNhap vi tri can chen: ";//vi tri bat dau tu 0 cin>>x; if(x>=0 && x<=n) { for(int i=x;i<=n;i++) sv[i+1]=sv[i]; n++; sv[x]=tmp[0]; } else cout<<"\nVi tri ko hop le!"; } else cout<<"\nDanh sach day."; } void xoa(danhsach sv[],int &n) { int x; cout<<"\nXoa sinh vien thu: "; cin>>x;cin.get(); if(x>=0 && x<= n) { for(int i=x;i<=n;i++) sv[i]=sv[i+1]; n--; } else cout<<"\nVi tri ko hop le !"; } /*int tknp(int l,int r,danhsach sv[],char x[])//de quy { int loc; if(l>r) loc=0; int m=(l+r)/2; if(strcmp(x,sv[m].masv)<0) loc=tknp(l,m-1,sv,x); if(strcmp(x,sv[m].masv)>0) loc=tknp(m+1,r,sv,x); else loc=m; return loc; }*/ int tknp(danhsach sv[],int n,char x[]) //ko de quy { int l=0, r=n; while(l<=r) { int m=(l+r)/2; if(strcmp(x,sv[m].masv)<0) r=m-1; else if(strcmp(x,sv[m].masv)>0) l=m+1; else return m; }return -1; } int unexchange(dslk **T,dsd d[]) { dslk *P; P=*T; int i=0; while(P!=NULL) { strcpy(d[i].masv,P->masv); i++; P=P->link; } } int exchange(dslk **T,danhsach sv[],int n,char x[]) { dslk *P; P=new dslk; strcpy(P->masv,x); P->link=(*T); (*T)=P; } void indslk(dslk **T) { dslk *P; P=*T; while(P!=NULL) { cout<<P->masv<<"\t"; P=P->link; } } char *tktt(dslk *T,char x[])//de quy { if(T==NULL) return 0; else if(strcmp(T->masv,x)==0) { return T->masv; } else tktt(T->link,x); } /*int tktt(danhsach sv[],int n,char x[])// khong de quy { int i=0; strcpy(sv[n].masv,x); while(strcmp(sv[i].masv,sv[n].masv)!=0) i++; if(i<n) return i; return -1; }*/ main() { dslk *T; T=NULL; danhsach sv[max]; dsd d[max]; int n; nhap(sv,n); //xuat(sv,n); //chen(sv,n); xuat(sv,n); for(int i=0;i<n;i++) exchange(&T,sv,n,sv[i].masv);//chuyen qua ds lk cout<<"\nDanh sach lien ket ma sv: "; indslk(&T); cout<<"\nChuyen danh sach lien ket qua ds dac: "; unexchange(&T,d); for(int k=0;k<n;k++) cout<<d[k].masv<<"\t"; char s[10]; cout<<"\nNhap ma sv can tim kiem: "; cin>>s; cout<<"\nTim thay: "<<tktt(T,s); } Hàm tìm kiếm tuần tự sau chỉ dùng 1 phép so sánh, đơn giản hơn hàm trong silde các bạn đang học. Tư tưởng: dùng giá trị của mảng tại vị trí n làm chốt, giá trị bằng giá trị cần tìm kiếm. nhằm giảm bớt 1 phép so sánh. Mã: /*int tktt(danhsach sv[],int n,char x[])// khong de quy { int i=0; strcpy(sv[n].masv,x); while(strcmp(sv[i].masv,sv[n].masv)!=0) i++; if(i<n) return i; return -1; }*/