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

Em mới viết đến đây, debug thì nó chạy tá lả. Mọi người giúp em tìm lỗi với !


#include <stdio.h>
#include <conio.h>
#include <string.h>

struct SinhVien
{
	int MSSV;
	char HoTen[30];
	float DiemTB;
};




void NhapSV(SinhVien &sv)
{
	printf("Nhap ma so sinh vien: ");
	scanf("%d",&sv.MSSV);
	printf("Nhap ho ten sinh vien: ");
	fflush(stdin);
	gets(sv.HoTen);
	printf("Nhap diem TB cua sinh vien: ");
	scanf("%f",&sv.DiemTB);
}




void XuatSV(SinhVien sv)
{
	printf("\nMSSV: %d",sv.MSSV);
	printf("\nHo va ten: ");
	puts(sv.HoTen);
	printf("Diem TB: %.2f",sv.DiemTB);
}




struct Node
{
	SinhVien Data;
	Node *Next;
};




struct List
{
	Node *Head;
	Node *Tail;
};




void CreateList(List &l)
{
	l.Head=l.Tail=NULL;
}




Node* CreateNode(SinhVien sv)
{
	Node *p = new Node;
	p->Data = sv;
	p->Next = NULL;
	return p;
}




void AddHead(List &l, SinhVien sv)
{
	Node *p = CreateNode(sv);
	if(l.Head==NULL)
		l.Head=l.Tail=p;
	p->Next=l.Head;
	l.Head=p;
}



void XemList(List l)
{
	Node *p = l.Head;
	while(p!=NULL)
	{
		XuatSV(p->Data);
		printf("\n");
		p=p->Next;
	}
}




void main()
{
	List l;
	CreateList(l);
	SinhVien sv1, sv2, sv3;
	NhapSV(sv1);
	NhapSV(sv2);
	NhapSV(sv3);
	AddHead(l,sv3);
	AddHead(l,sv2);
	AddHead(l,sv1);
	XemList(l);
	getch();
}

1 Like

Em so sánh với code ở đây xem:

1 Like

AddHead trong if == NULL thì return luôn, còn không thì head-> next = head nên bị lặp vô hạn

3 Likes

Bạn nói đúng, mình đã thực hiện luôn 2 dòng phía dưới lệnh l.Head=l.Tail=p; Lẽ ra phải rẽ nhánh, mình quên dùng else

void AddHead(List &l, SinhVien sv)
{
	Node *p = CreateNode(sv);
	if(l.Head==NULL)
		l.Head=l.Tail=p;
	else
	{
		p->Next=l.Head;
		l.Head=p;
	}
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?