e đang làm phần danh sách liên kết đơn mà code e thấy k sai đâu ạ, nhưng nhập xong nó k out được a ạ! trong struct SinhVien nếu e để 2 kiểu dữ liệu char và 2 kiểu int thì chạy ok, các a thử xem giúp e tại sao lại như vậy k ạ ! e cảm ơn ạ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//khai báo struct sinh viên
struct SinhVien {
char HoTen[30];
char MaSv[3];
int Tuoi;
char Lop[10];
};
typedef struct SinhVien SV;
//khai báo cấu trúc danh sách liên kết đơn
struct Node {
SV data;
struct Node *pNext;
};
typedef struct Node NODE;
//khai báo list
struct List {
NODE *pHead;
NODE *pTail;
};
typedef struct List LIST;
//khởi tạo danh dách liên kết đơn
void createlist (LIST *l) {
l->pHead=l->pTail=NULL;
}
//tạo 1 node trong danh sách liên kết đơn
NODE* getnode (SV x) { //x là dữ liệu đưa vào data
NODE *p=(NODE*)malloc(1*sizeof(NODE*));
if (p==NULL) {
return NULL;
}
p->data=x;
p->pNext=NULL;
return p;
}
//thêm node
//thêm cuối
void addtail (LIST *l, NODE *p) {
if (l->pHead==NULL) { //khi trống
l->pHead=l->pTail=p;
} else {
(*l).pTail->pNext=NULL;
l->pTail=p;
}
}
void AddHead(LIST *l, NODE *p)
{
if(l->pHead == NULL) // Tức là danh sách bị rỗng
{
l->pHead = l->pTail = p;
}
else
{
p ->pNext = l->pHead; // p quăng dây để tham gia vào danh sách
l->pHead = p; // p chính thức đã đứng dầu danh sách
}
}
//nhập thông tin 1 sinh viên
void NhapThongTinSinhVien (SV *sv) {
do {
printf("\nHo Ten Sinh Vien: ");
fflush(stdin);
gets(sv->HoTen);
if (strlen(sv->HoTen)>30)
printf("\nDo dai ten nho hon 30 ki tu. Hay Nhap Lai");
} while (strlen(sv->HoTen)>30);
do {
printf("\nMa So Sinh Vien: ");
fflush(stdin);
gets(sv->MaSv);
if (strlen(sv->MaSv)>3)
printf("\nDo dai MSSV nho hon 3 ki tu. Hay Nhap Lai");
} while (strlen(sv->MaSv)>3);
do {
printf("\nTuoi: ");
scanf("%d",&sv->Tuoi);
if (sv->Tuoi<0) {
printf("\nTuoi sai. Nhap lai");
}
} while (sv->Tuoi<0);
do {
printf("\nLop: ");
fflush(stdin);
gets(sv->Lop);
if (strlen(sv->Lop)>10)
printf("\nDo dai Lop nho hon 10 ki tu. Hay Nhap Lai");
} while (strlen(sv->Lop)>10);
}
void XuatThongTinSinhVien (SV sv) {
printf("\n%-15s %-10s %-10d %-10s",sv.HoTen,sv.MaSv,sv.Tuoi,sv.Lop);
}
//nhập dữ liệu cho danh sách
void Input (LIST *l,int n) {
createlist(l);
for (int i=0; i<n; i++) {
SV x;
printf("\nNhap Thong Tin Sinh Vien Thu %d",i+1);
NhapThongTinSinhVien(&x);
NODE *p=getnode(x);
//addtail(l,p);
AddHead(l,p);
}
}
void Output (LIST l) {
printf("\n%-15s %-10s %-10s %-10s","Ho Ten","Ma SV", "Tuoi", "Lop");
for (NODE *p=l.pHead; p!=NULL; p=p->pNext) {
XuatThongTinSinhVien(p->data);
}
}
void GiaiPhong (LIST *l) {
NODE *p; // Khai báo Node p.
while(l->pHead != NULL) {
p = l->pHead;
l->pHead = (*l).pHead ->pNext;
free(p);
}
}
int main() {
LIST l;
int n;
printf("\nNhap So Sinh Vien: ");
scanf("%d",&n);
Input(&l,n);
Output(l);
GiaiPhong(&l);
return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?