Danh sách liên kết đơn?

mình có bài dslk như sau, nó bị lỗi ở phần sắp xếp sinh viên theo điểm và hiện ds sinh viên có điểm lớn nhất, khi chọn vào 2 cái đó thì bị crash, không hiểu mình sai ở đâu.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//Khoi tao cau truc du lieu cua danh sach lK don kieu SinhVien
struct SinhVien{
	char masv[100];
	char tensv[100];
	float diemsv;	
};

//Khoi tao 1 NODE 
struct Node{
	SinhVien data;
	struct Node *pNext;
};typedef struct Node NODE;

//Khoi tao danh sách lien ket
struct List{
	NODE *pHead;
	NODE *pTail;
};typedef struct List LIST;

//Khoi tao danh sach rong
void Init(LIST &l){	
	l.pHead = l.pTail = NULL;
}

//Tao NODE chua data vao con tro pNext trong danh sach 
NODE* get_node(SinhVien x){
	NODE *p = new NODE;
	if(p==NULL){
		printf("Bo nho khong du");
		return 0;	
	}
	p->data = x; // Luu sinh vien x vao data
	p->pNext = NULL; // Khoi tao moi lien ket 
	return p;
}
//Nhap sinh vien
void nhapsv(SinhVien &sv){

	printf("\nNhap ma Sinh vien: ");
	fflush(stdin);
	gets(sv.masv);

	printf("Nhap ho ten Sinh Vien: ");
	gets(sv.tensv);
	fflush(stdin);
	
	printf("Nhap diem trung binh sinh vien: ");
	scanf("%f",&sv.diemsv);
	fflush(stdin);
}
//Xuat sinh vien
void xuatsv(SinhVien sv){
	printf("\n");
	printf("%s\t%s\t%.2f",sv.masv,sv.tensv,sv.diemsv);
}
//Hoan vi 2 sinh vien 
void hoanvi(SinhVien &sv1, SinhVien &sv2){
	SinhVien t = sv1;
	sv1 = sv2;
	sv2 = t;
}
//Tim sinh vien co diem MAX
void diemMAX(LIST l){
	int dem;
	NODE *p = l.pHead;
	NODE *max;
	max = p;
	for(p; p!=NULL; p=p->pNext){
		if(p->data.diemsv > max->data.diemsv){
			max = p; dem = 0;
		}
		if(p->data.diemsv == max->data.diemsv){
			max = p; dem++;
		}
	}
	if(dem == 0){
		xuatsv(max->data);
	}else{
		NODE *q = l.pHead;
		while(q!=NULL){
			if(p->data.diemsv==max->data.diemsv){
				xuatsv(q->data);
				q=q->pNext;
			}
		}
	}
}
//Sap xep sinh vien diem tang dan 
void sapxeptang(LIST l){
	for(NODE *p=l.pHead; p!=l.pTail; p=p->pNext){
		for(NODE *p1=p->pNext; p!=NULL; p1=p1->pNext){
			if(p->data.diemsv > p1->data.diemsv){
				hoanvi(p->data,p1->data);
			}
		}		
	}
}
//Menu
int menu(){
	SinhVien sv;
	LIST l;
	int luachon;
	Init(l);//Khoi tao danh sach NODE
	do	
	{
		printf("\n=====MENU=====");
		printf("\n1. Nhap danh sach sinh vien");
		printf("\n2. Hien danh sach sinh vien");
		printf("\n3. Tim sinh vien");
		printf("\n4. Xoa sinh vien");
		printf("\n5. Tim sinh vien co diem cao nhat");
		printf("\n6. Sap xep sinh vien theo diem so tang dan");
		printf("\n0. Thoat");
		printf("\nMoi ban chon chuc nang: ");
		scanf("%d",&luachon);
			
		switch(luachon)
		{
			case 1:	
				taods(l);
				system("cls");	
				break;
			case 2:
				printf("\n=====Danh sach sinh vien=====");
				printf("\nMa sv\tTen sv\tDiem sv");
				hiends(l);	
				break;
			case 3:
				timsv(l,sv);
				break;
			case 4:
				xoasv(l);
				break;
			case 5:
				printf("\n=====THONG TIN SINH VIEN CO DIEM LON NHAT=====");
				printf("\nMa sv\tTen sv\tDiem sv");
				diemMAX(l);
				break;
			case 6:
				printf("\n=====DANH SACH SINH VIEN SAU KHI SAP XEP=====");
				printf("\nMa sv\tTen sv\tDiem sv");
				sapxeptang(l);
				break;
			case 0:
				break;
			default: 
				printf("Ban da chon sai, vui long chon lai !");
		}
	}while(luachon!=0);
	giaiphong(&l);
	return 1;		
}
int main(){
    system("cls");
    menu();
    system("cls");
    return 0;
}

Format code đi bạn ơi dài như vậy mà ko format thì sao người khác đọc cho bạn dc đây :sweat:

mình sửa rồi đó…

1 Like

Bạn nên debug, trích ra phần sai rồi đăng lên, chứ bạn đăng cả file code như vậy rối lắm

Việc gian nan nhất của lập trình viên không phải là code mà là đọc code người khác

mình bị sai ở 2 hàm này

//Hoan vi 2 sinh vien 
void hoanvi(SinhVien &sv1, SinhVien &sv2){
	SinhVien t = sv1;
	sv1 = sv2;
	sv2 = t;
}
//Tim sinh vien co diem MAX
void diemMAX(LIST l){
	int dem;
	NODE *p = l.pHead;
	NODE *max;
	max = p;
	for(p; p!=NULL; p=p->pNext){
		if(p->data.diemsv > max->data.diemsv){
			max = p; dem = 0;
		}
		if(p->data.diemsv == max->data.diemsv){
			max = p; dem++;
		}
	}
	if(dem == 0){
		xuatsv(max->data);
	}else{
		NODE *q = l.pHead;
		while(q!=NULL){
			if(p->data.diemsv==max->data.diemsv){
				xuatsv(q->data);
				q=q->pNext;
			}
		}
	}
}
//Sap xep sinh vien diem tang dan 
void sapxeptang(LIST l){
	for(NODE *p=l.pHead; p!=l.pTail; p=p->pNext){
		for(NODE *p1=p->pNext; p!=NULL; p1=p1->pNext){
			if(p->data.diemsv > p1->data.diemsv){
				hoanvi(p->data,p1->data);
			}
		}		
	}
}

Mình cũng bị chỗ này . chưa tìm được cách giải quyết :frowning:

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