Quản lý sinh viên sử dụng danh sách liên kết đôi

Mọi người giúp em với
Đây là bài toán quản lý danh sách sinh viên,em mới hoàn thành được chức năng nhập dữ liệu vào danh sách , in ra danh sách ,tìm kiếm danh sách theo 1 mã lớp.Chức năng sắp xếp tên theo thứ tự tên ,và sắp xếp theo điểm trung bình em chưa là được .Mọi người có thể vào xem giúp em với,em cảm ơn.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct DNode
{
     int masv;
     char malop[12];
     char ht[30];
     float diemk1;
     float diemk2;
     float diemtb;
     struct DNode *next,*back;
}DNODE;
 
typedef struct DList
{
     DNODE *head,*tail;
}DLIST;
 
 
void Newlist(DLIST &L)
{
     L.head=L.tail=NULL;
}
 
void addtail(DList &L,DNODE *p)
{
     if(p==NULL) return;
     if(L.head==NULL)
     {
          p->next=p->back=NULL;
          L.head=p;
          L.tail=L.head;
 
     }
     else
     {
          p->back=L.tail;
          p->next=NULL;
          L.tail->next=p;
          L.tail=p;
     }
}
 
DNode* createNode(int mssv,char mlop[],char hoten[],float diem1, float diem2)
{
 
  float diemtrungbinh = (diem1+diem2)/2;
  DNode *p = (DNODE *) malloc(sizeof(DNODE));
    if(!p) return NULL;
    p->masv = mssv;
    strcpy(p->malop,mlop);
    strcpy(p->ht,hoten);
    p->diemk1 = diem1;
    p->diemk2 = diem2;
    p->diemtb = diemtrungbinh;
    p->next=p->back=NULL;
    return p;
 
}
 
void createList(DLIST &l, int n){
    DNode *p;
    int mssv;
    char hoten[30],mlop[12];
    float diem1, diem2;
    fflush(stdin);
    do {
        fflush(stdin);
        printf("\nNhap ma sinh vien: ");
        scanf("%d",&mssv);
        if(mssv != 0){
        	fflush(stdin);
            printf("\nNhap ma lop: ");
            gets(mlop);
            fflush(stdin);
            printf("\nNhap ho ten: ");
            gets(hoten);
            fflush(stdin);
            printf("\nNhap diem k1 ( < 10 ): ");
            scanf("%f", &diem1);
            printf("\nNhap diem k2 ( 10 ): ");
            scanf("%f", &diem2);
              p = createNode(mssv, mlop, hoten, diem1, diem2);
              if(!p) return;
              addtail(l,p);
             n--;
        }
        }while(n >= 0);
    }
 
void in(DList l)
{
    DNode *p;
    p=l.head;
    printf("MASV	    Malop	   Ho ten	  Diemk1      Diemk2     Diemtb\n");
    while(p!=NULL)
        {
            printf("\n\n\n");
            printf("%d",p->masv);
            printf("%10s",p->malop);
            printf("%20s",p->ht);
            printf("%10.2f",p->diemk1);
            printf("%10.2f",p->diemk2);
            printf("%10.2f",p->diemtb);
            p=p->next;
        }
}
 
void sxten(DList l)
{
	
	
	DNode *p,*q;
	DNode *k ;
	p = l.head;	
	while (p!=NULL)  
                  
    {                        
     for (q=p->next;q!=NULL;q=q->next) 
              if((p->diemtb)<(q->diemtb))
              {
              		k = q;
              		
//                   k->masv = p->masv;
//                   strcmp(k->malop,p->malop);
//                   strcmp(k->ht , p->ht);
//                   k->diemk1 = p->diemk1;
//                   k->diemk2 = p->diemk2;
//                   k->diemtb = p->diemtb;
//                   
//                   p->masv = q->masv;
//                   strcmp(p->malop , q->malop);
//                   strcmp(p->ht , q->ht);
//                   p->diemk1 = q->diemk1;
//                   p->diemk2 = q->diemk2;
//                   p->diemtb = q->diemtb;
//                   
//				   q->masv = k->masv;
//                   strcmp(q->malop , k->malop);
//                   strcmp(q->ht ,k->ht);
//                   q->diemk1 = k->diemk1;
//                   q->diemk2 = k->diemk2;
//                   q->diemtb = k->diemtb;  
              }
              
     if(k->diemtb != p->diemtb)
	 {
			
	 }         
     p = p->next;
    }
    DNode *m;
    m = l.head;
    printf("MASV	    Malop	   Ho ten	  Diemk1      Diemk2     Diemtb\n");
	in(m);
//    while(m != NULL)
//    {
//     		printf("\n\n\n");
//            printf("%d",p->masv);
//            printf("%10s",p->malop);
//            printf("%20s",p->ht);
//            printf("%10.2f",p->diemk1);
//            printf("%10.2f",p->diemk2);
//            printf("%10.2f",p->diemtb);
//            p=p->next;	
//    }
}

 
void kt(DList l)
{
    char kt[10];
    DNode *p;
    int found=0;
    p=l.head;
    fflush(stdin);
    printf("Nhap ma lop muon tim");
    gets(kt);
    printf("MASV	    Malop	   Ho ten	  Diemk1      Diemk2     Diemtb\n");
    while(p!=NULL)
        if (strcmp(p->malop,kt) == 0)
        {
            printf("\n\n\n");
            printf("%d",p->masv);
            printf("%10s",p->malop);
            printf("%20s",p->ht);
            printf("%10.2f",p->diemk1);
            printf("%10.2f",p->diemk2);
            printf("%10.2f",p->diemtb);
            found++;
            p=p->next;
        }
        else
          p = p->next;
 
  if (!found)
     printf("\n\n\nKhong co!!!");
}
 


  
int  main()
{
    DList a;
    Newlist(a);
    int n,x;
    printf("\nNhap so sv : ");
    scanf("%d",&n);
    createList(a, n-1);
    printf("\n  +++++++++++++++++++++++++++++++++++++++++");
    printf("\n  +     Cac thu tuc ban muon xu li        +");
    printf("\n  +++++++++++++++++++++++++++++++++++++++++");
	printf("\n  +1.In toan bo danh sach                 +");
    printf("\n  +2.Danh sach sinh vien theo ma lop             +");
    printf("\n  +3.Sap xep theo diem             +");
    while(1){
    printf("\n  +++++++++++++++++++++++++++++++++++++++++");
    printf("\n  +Hay nhap lua chon cua ban              +");
    printf("\n  +++++++++++++++++++++++++++++++++++++++++\n");
    scanf("%d",&x);
    switch(x)
    {
    case 1: in(a); break;
    case 2: kt(a); break;
    case 3: sxten(a); break;
    
	}
}
getch();

}

Bạn format code lại để dễ xem hơn bằng cách

```cpp

Code của bạn

```

1 Like

Cám ơn bạn,mình vừa sửa lại rồi

Hi mai.

void Newlist(DLIST &L)
{
     L.head=L.tail=NULL;
}

Mình không hiểu & dùng làm gì ?

1 Like

Khởi tạo DSLK mới bằng cách gán đầu và đuôi bằng NULL, size = 0.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?