- Code:
#include<stdio.h>
#include<conio.h>
#include<math.h>
typedef struct sinhvien
{
char hoten[30];
int masv;
}SV;
typedef struct node
{
SV info;
struct node *pNext;
}NODE;
typedef struct tagList
{
NODE* pHead;
NODE* pTail;
}LIST;
int IsEmptyList(LIST &l)
{
return ((l.pHead==NULL)&&(l.pTail==NULL));
}
void Init(LIST &l)
{
l.pHead = l.pTail=NULL;
}
NODE* GetNode(SV x)
{
NODE *p;
p = new NODE;
if(p==NULL)
{
printf("Khong du bo nho");
exit(1);
}
p->info = x;
p->pNext = NULL;
return p;
}
void AddFirst(LIST &l, NODE* new_ele)
{
if(l.pHead ==NULL)
{
l.pHead = new_ele;
l.pTail = l.pHead;
}
else
{
new_ele->pNext = l.pHead;
l.pHead = new_ele;
}
}
void AddTail(LIST &l,NODE* new_ele)
{
if(l.pHead==NULL)
l.pHead=l.pTail=new_ele;
else
{
l.pTail->pNext=new_ele;
l.pTail=new_ele;
}
}
void AddAfter(LIST &l,NODE* q,NODE* new_ele)
{
int Masv;
printf("Chen sau Masv:");
fflush(stdin);
scanf("%d",&Masv);
for(q=l.pHead;q;q=q->pNext)
{
if(q->info.masv==Masv)
{
if(q!= NULL)
{
new_ele->pNext=q->pNext;
q->pNext=new_ele;
if(q==l.pTail)
l.pTail=new_ele;
}
else
AddFirst(l,new_ele);
}
}
}
void RemoveHead(LIST &l)
{
if(l.pHead!=NULL)
{
NODE*p=l.pHead;
l.pHead=l.pHead->pNext;
delete p;
if(l.pHead== NULL) l.pTail=NULL;
}
else
printf("\nHuy that bai:");
}
void Removelist(LIST &l)
{
while(l.pHead)
{
NODE* p=l.pHead;
l.pHead=l.pHead->pNext;
delete p;
}
l.pTail=NULL;
}
void RemoveTail(LIST &l)
{
NODE *p,*q;
p = l.pHead;
if(p->pNext == NULL)
{
RemoveHead(l);
return;
}
while(p->pNext!= NULL)
{
q = p;
p = p->pNext;
}
q->pNext = NULL;
delete p;
}
void RemoveNode(LIST &l,int Msv)
{
NODE *p, *q;
p = l.pHead;
if(p->info.masv == Msv)
{
l.pHead = p->pNext;
delete p;
}
else
q = p->pNext;
if(q->info.masv ==Msv)
{
p->pNext = q->pNext;
q->pNext = NULL;
delete q;
}
}
NODE* Search(LIST l)
{
char hoten[30];
int Masv;
int i=1;
NODE* p=l.pHead;
printf("Nhap vao ma so sinh vien :");
scanf("%d",&Masv);
while(p&&p->info.masv!=Masv)
p=p->pNext;
return p;
}
void hoanvi(SV &a,SV &b)
{
SV itamp;
itamp=a;
a=b;
b=itamp;
}
void ListSelectionSort(LIST &l)
{
NODE*min;
NODE *p, *q;
p = l.pHead;
while(p!=l.pTail)
{
q = p->pNext;
min = p;
while(q!=NULL)
{
if(q->info.masv < min->info.masv)
min = q;
q = q->pNext;
}
hoanvi(min->info, p->info);
p = p->pNext;
}
}
void InterChangeSort(LIST &l)
{
NODE *p;
NODE *q;
for ( p=l.pHead ; p!=l.pTail ; p=p->pNext )
for ( q=p->pNext ; q!=NULL ; q=q->pNext )
if ( p->info.masv > q->info.masv )
hoanvi( p->info , q->info );
}
void XuatDS(LIST l)
{
NODE *p;
p=l.pHead;
if(l.pHead==NULL)
printf("\n Danh sach rong");
printf("\n-------------------------------");
printf("\n%-20s %-20s ","MaSV","Ho Ten");
printf("\n-------------------------------");
while(p!=NULL)
{
printf("\t\n%-20d %-20s ",p->info.masv,p->info.hoten);
p=p->pNext;
}
}
void XuatTK(NODE* p)
{
if(p==NULL)
printf("\nDanh sach rong");
else
{
printf("\nSinh vien ban can tim:");
printf("\n-------------------------------");
printf("\n%-20s %-20s ","MaSV","Ho Ten");
printf("\n-------------------------------");
printf("\t\n%-20d %-20s ",p->info.masv,p->info.hoten);
}
}
void main()
{
printf("\n_________________Quan ly Sinh vien_____________________");
printf("\n__________________Tran Van Thinh_______________________");
SV x;
LIST l;
NODE* p=new NODE;
NODE* q=new NODE;
NODE* a=new NODE;
Init(l);
int tiep=1;
int chon;
int i;
int n;
printf("\n\nNhap vao so sinh vien : ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\nNhap vao sinh vien thu %d",i+1);
fflush(stdin);
printf("\n\nNhap vao ho ten:");
gets(x.hoten);
printf("\n\nNhap vao mssv:");
scanf("%d",&x.masv);
p=GetNode(x);
AddTail(l,p);
}
XuatDS(l);
printf("\n______________________________________________________________");
while(tiep==1)
{
printf("\n\t----------------------------------------------------");
printf("\n\t+ MENU +");
printf("\n\t-----------------------------------------------------");
printf("\n\t+ 1.Chen 1 NODE vao dau DSLK +");
printf("\n\t+ 2.Chen 1 NODE vao cuoi DSLK +");
printf("\n\t+ 3.Chen 1 NODE sau DSLK +");
printf("\n\t+ 4.Xoa 1 NODE o dau DSLK +");
printf("\n\t+ 5.Xoa 1 NODE o cuoi DSLK +");
printf("\n\t+ 6.Xoa Node bat ki +");
printf("\n\t+ 7.huy toan bo danh sach +");
printf("\n\t+ 8.Duyet DSLK +");
printf("\n\t+ 9.Tim 1 NODE co khoa k +");
printf("\n\t+ 10.Sap xep DSLK theo pp interChangeSort +");
printf("\n\t+ 11.Sap xep theo pp selecsionsort +");
printf("\n\t+ 0:thoat. +");
printf("\n\t+---------------------------------------------------+");
printf("\nMoi ban chon:");
scanf("%d",&chon);
switch(chon)
{
case 1:
fflush(stdin);
printf("\n\nNhap vao ho ten:");
gets(x.hoten);
printf("\n\nNhap vao mssv:");
scanf("%d",&x.masv);
p=GetNode(x);
AddFirst(l,p);
printf("\nDanh sach sau khi them");
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 2:
fflush(stdin);
printf("\n\nNhap vao ho ten:");
gets(x.hoten);
printf("\n\nNhap vao mssv:");
scanf("%d",&x.masv);
p=GetNode(x);
AddTail(l,p);
printf("\nDanh sach sau khi them");
XuatDS(l);
printf("\nTiep 1!! thoat phi bat ki : ");
scanf("%d",&tiep);
break;
case 3:
fflush(stdin);
printf("\n\nNhap vao ho ten:");
gets(x.hoten);
printf("\n\nNhap vao mssv:");
scanf("%d",&x.masv);
q=GetNode(x);
AddAfter(l,p,q);
printf("\nDanh sach sau khi them");
XuatDS(l);
printf("\nTiep 1!! thoat phi bat ki : ");
scanf("%d",&tiep);
break;
case 4:
printf("\nDa xoa sv dau ds\n\n");
RemoveHead(l);
printf("\n\tDanh sach sau khi xoa");
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 5:
printf("\nDa xoa sv cuoi DS\n\n");
RemoveTail(l);
printf("\n\tDanh sach sau khi xoa");
XuatDS(l);
printf("\nTiep 1!! thoat phi bat ki : ");
scanf("%d",&tiep);
break;
case 6:
int Msv;
printf("\n\nNhap vao mssv ban muon xoa:");
scanf("%d",&Msv);
RemoveNode(l,Msv);
printf("\n\tDanh sach sau khi xoa");
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 7:
Removelist(l);
XuatDS(l);
printf("\nTiep 1!! thoat phi bat ki : ");
scanf("%d",&tiep);
break;
case 8:
printf("\nDuyet danh sach:");
printf("\n");
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 9:
a=Search(l);
if(a!=NULL)
XuatTK(a);
else
{
printf("Khong thay Ma Sv nay");
}
printf("\nTiep 1!! thoat phi bat ki : ");
scanf("%d",&tiep);
break;
case 10:
printf("\nMang da xap xep theo ma sinh vien:");
InterChangeSort(l);
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 11:
printf("\nMang da xap xep theo ma sinh vien:");
ListSelectionSort(l);
XuatDS(l);
printf("\nTiep 1!! thoat phim bat ki!! : ");
scanf("%d",&tiep);
break;
case 0:
exit(1);
}
}
}
4 posters
bài Danh sách liên kết đơn
tranthinh_it- Newbie
- Giới tính : Bài gửi : 2
Tổng Điểm : 4
Điểm Thưởng : 0
Sinh Nhật : 26/10/1989 Bị Dụ Dỗ : 02/12/2009
Tuổi : 35
- Post n°1
bài Danh sách liên kết đơn
Vy Thanh Định- Web Master
- Giới tính : Bài gửi : 228
Tổng Điểm : 544
Điểm Thưởng : 16
Sinh Nhật : 19/05/1990 Bị Dụ Dỗ : 11/09/2009
Tuổi : 34
- Post n°2
Re: bài Danh sách liên kết đơn
Mình đã chạy thử bài của bạn và thấy có một số lỗi! Chẳng hạn như chọn phương pháp sắp xếp interchargesort , sau khi sắp xếp nhấn phím bất kì để tiếp tục thì tạo ra vòng lặp vô tận, chạy không dừng, và một số chỗ không có fflush(stdin) đường vào chuẩn của C, khiến một số dòng nhập không được thực hiện , bạn coi lại nhé !
tranthinh_it- Newbie
- Giới tính : Bài gửi : 2
Tổng Điểm : 4
Điểm Thưởng : 0
Sinh Nhật : 26/10/1989 Bị Dụ Dỗ : 02/12/2009
Tuổi : 35
- Post n°3
Re: bài Danh sách liên kết đơn
cảm ơn bạn . do chỗ menu , mình để "int tiep" nen chi nhập số , chắc bạn nhập kí tự nên nó thế , mình đã sưa xong , phím 1 để tiếp tuc chứ không phải phím bất kì để tiếp tục bạn à , cảm ơn bạn đã góp ý kiến
mình chỉ sử dung fflush(stdin) đối với nhập chuỗi , còn nhập số thì mình khồn sử dụng , ban có thể nói rõ lỗi đc không , để mình sửa , cảm ơn bạn nhìu
mình chỉ sử dung fflush(stdin) đối với nhập chuỗi , còn nhập số thì mình khồn sử dụng , ban có thể nói rõ lỗi đc không , để mình sửa , cảm ơn bạn nhìu
kocogi- Member
- Giới tính : Bài gửi : 22
Tổng Điểm : 24
Điểm Thưởng : 0
Sinh Nhật : 18/03/1990 Bị Dụ Dỗ : 26/11/2009
Tuổi : 34
- Post n°4
Re: bài Danh sách liên kết đơn
lỗi ở đây là ko ai chịu xài nhập xuất = file cả. :O
Vy Thanh Định- Web Master
- Giới tính : Bài gửi : 228
Tổng Điểm : 544
Điểm Thưởng : 16
Sinh Nhật : 19/05/1990 Bị Dụ Dỗ : 11/09/2009
Tuổi : 34
- Post n°5
Re: bài Danh sách liên kết đơn
Tại vì thói quen thui, sao kiu là lỗi ????
DarkEternal- New Member
- Giới tính : Bài gửi : 7
Tổng Điểm : 15
Điểm Thưởng : 4
Sinh Nhật : 11/08/1990 Bị Dụ Dỗ : 01/12/2009
Tuổi : 34
- Post n°6
Re: bài Danh sách liên kết đơn
Đúng là với các bài struct về quản lí thế này thì việc tối ưu nhất đó là nhập xuất bằng file.Như thế tránh cho máy phải vất vả việc xử lý nhập xuất từng biến 1.Ngoài ra ,không biết có phải do các phần mềm như Cfree hay DevC ,việc fflush(stdin) vẫn ko ổn định cho việc nhập chuỗi kí tự từ bàn phím,trong khi BorlandC thì ok hết.Nhưng tất nhiên nhập xuất từ bàn phím cũng ko là vấn đề gì đối với bài tập này.kocogi đã viết:lỗi ở đây là ko ai chịu xài nhập xuất = file cả. :O
DarkEternal- New Member
- Giới tính : Bài gửi : 7
Tổng Điểm : 15
Điểm Thưởng : 4
Sinh Nhật : 11/08/1990 Bị Dụ Dỗ : 01/12/2009
Tuổi : 34
- Post n°7
Re: bài Danh sách liên kết đơn
Bài danh sách liên kết đơn của bạn khá ổn nhưng quá rối mắt về phần code.
-Thứ nhất,theo mình bạn nên để thân hàm main của bạn chỉ là việc gọi hàm Input để vào dữ liệu sau đó hàm Output.Tiếp theo bạn cho menu vào sau đó dùng vòng lặp để bắt đầu chọn menu và cứ mỗi số từ việc chọn bạn viết nó thành 1 hàm riêng.
-Thứ hai,Hàm IsEmptyList là không cần thiết,có lẽ ở đây ý bạn nó là hàm Init khởi dựng 1 list nên cho head và tail nó bằng NULL ?Hoặc bạn muốn nó kiểm tra rằng List đã rỗng?.
Chúc bạn có thể cải thiện tốt bài tập này
-Thứ nhất,theo mình bạn nên để thân hàm main của bạn chỉ là việc gọi hàm Input để vào dữ liệu sau đó hàm Output.Tiếp theo bạn cho menu vào sau đó dùng vòng lặp để bắt đầu chọn menu và cứ mỗi số từ việc chọn bạn viết nó thành 1 hàm riêng.
-Thứ hai,Hàm IsEmptyList là không cần thiết,có lẽ ở đây ý bạn nó là hàm Init khởi dựng 1 list nên cho head và tail nó bằng NULL ?Hoặc bạn muốn nó kiểm tra rằng List đã rỗng?.
Chúc bạn có thể cải thiện tốt bài tập này