30/09/2018, 21:40

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("
Nhap 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("
");
	printf("%s	%s	%.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("
=====MENU=====");
		printf("
1. Nhap danh sach sinh vien");
		printf("
2. Hien danh sach sinh vien");
		printf("
3. Tim sinh vien");
		printf("
4. Xoa sinh vien");
		printf("
5. Tim sinh vien co diem cao nhat");
		printf("
6. Sap xep sinh vien theo diem so tang dan");
		printf("
0. Thoat");
		printf("
Moi ban chon chuc nang: ");
		scanf("%d",&luachon);
			
		switch(luachon)
		{
			case 1:	
				taods(l);
				system("cls");	
				break;
			case 2:
				printf("
=====Danh sach sinh vien=====");
				printf("
Ma sv	Ten sv	Diem sv");
				hiends(l);	
				break;
			case 3:
				timsv(l,sv);
				break;
			case 4:
				xoasv(l);
				break;
			case 5:
				printf("
=====THONG TIN SINH VIEN CO DIEM LON NHAT=====");
				printf("
Ma sv	Ten sv	Diem sv");
				diemMAX(l);
				break;
			case 6:
				printf("
=====DANH SACH SINH VIEN SAU KHI SAP XEP=====");
				printf("
Ma sv	Ten sv	Diem 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;
}
mt viết 23:55 ngày 30/09/2018

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

Châu Milano viết 23:56 ngày 30/09/2018

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

Tý Tèo viết 23:47 ngày 30/09/2018

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

Ngân Béo viết 23:40 ngày 30/09/2018

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

Châu Milano viết 23:45 ngày 30/09/2018

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);
			}
		}		
	}
}
Bài liên quan
0