You are on page 1of 7

Bài 4: Khai báo cấu trúc danh sách liên kết đơn/kép.

Thông tin trong mỗi nút gồm: họ,

Tên, mã sv, điểm trung bình.

Bài làm

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#include<stdbool.h>

typedef struct {

char Hoten[30];

int MaSV;

float DiemTB;

} Data;

//------------------------------------//

typedef struct tagNode {

Data infor;

struct tagNode *link;

} Node;

//------------------------------------//

typedef struct tagList {

Node *pHead;

Node *pTail;

int spt;

} List;

List L;

//------------------------------------//

void Init_List(List *L) {

L->pHead = NULL;

L->pTail = NULL;

L->spt = 0;

//------------------------------------//
int emptyList(List L) {

return (L.spt == 0);

//------------------------------------//

void insert_Head(List *L, int Ma, char *Ten, float Diem) {

Node *pp;

pp = (Node*)malloc(sizeof(Node));

//-------------------------//

pp->infor.MaSV = Ma;

strcpy(pp->infor.Hoten,Ten);

pp->infor.DiemTB = Diem;

//-------------------------//

pp->link = NULL;

if(emptyList(*L)){

L->pHead = pp;

L->pTail = pp;

else {

pp->link = L->pHead;

L->pHead = pp;

L->spt++;

void Process_List(List *L) {

Node *p;

p = L->pHead;

while (p!=NULL) {

printf("\nMa SV: %d, Ten SV: %s, Diem TB: %1.1f", p->infor.MaSV, p-
>infor.Hoten,p->infor.DiemTB);

p = p->link;
}

int main() {

Init_List(&L);

insert_Head(&L,5,"Dao Van Dong",7.5);

insert_Head(&L,7,"Ngo Van Huy", 3.3);

insert_Head(&L,8,"Nguyen Thi Hai", 8.3);

insert_Head(&L,2,"Do Van Duong",4.4);

insert_Head(&L,1,"Dao The Phong",7.8);

insert_Head(&L,20,"Le Dang Quang",5.5);

insert_Head(&L,12,"Nguyen Thuy Hong",9.4);

Process_List(&L);

printf("\n");

Bài 5: Thêm một nút vào đầu/cuối danh sách liên kết đơn/kép

Bài làm

#include<stdio.h>

#include<malloc.h>

typedef char Data;

//------------------------------------//

typedef struct tagNode {

Data infor;

struct tagNode *link;

} Node;

//------------------------------------//

typedef struct tagList {

Node *pHead;

Node *pTail;

int spt;

} List;

//------------------------------------//

List L;
//------------------------------------//

void InitList(List *L) {

L->pHead = NULL;

L->pTail = NULL;

L->spt = 0;

//------------------------------------//

int emptyList(List L) {

return (L.spt == 0);

//------------------------------------//

void insert_Head(List *L, Data x) {

Node *pp;

pp = (Node*)malloc(sizeof(Node));

pp->infor = x;

pp->link = NULL;

if(emptyList(*L)){

L->pHead = pp;

L->pTail = pp;

else {

pp->link = L->pHead;

L->pHead = pp;

L->spt++;

//------------------------------------//

void insert_Tail(List *L, Data x) {

Node *pp;

pp = (Node*) malloc(sizeof(Node));

pp->infor = x;
pp->link = NULL;

if(emptyList(*L)) {

L->pHead = pp;

L->pTail = pp;

else {

L->pTail->link = pp;

L->pTail = pp;

L->spt++;

//------------------------------------//

Bài 6: Thêm một nút mới vào sau nút nào đó trong danh sách liên kết đơn/kép

Bài làm

void insert_After(List *L, Node *q, Data x) {

Node *pp;

if(NULL==q)

return;

else {

pp = (Node*) malloc(sizeof(Node));

pp->infor = x;

pp->link = q->link;

q->link = pp;

if(q==L->pTail)

L->pTail = pp;

L->spt++;

//-----------------------------------------------------------//

Ví dụ: Thêm một nút mới vào sau nút có mã sv là x

void insert_After(List *L, Node *q, int Ma, char *Ten, float Diem) {
Node *pp;

if(NULL==q)

return;

else {

pp = (Node*) malloc(sizeof(Node));

//-------------------------//

pp->infor.MaSV = Ma;

strcpy(pp->infor.Hoten,Ten);

pp->infor.DiemTB = Diem;

//-------------------------//

pp->link = q->link;

q->link = pp;

if(q==L->pTail)

L->pTail = pp;

L->spt++;

Bài 8: Cho danh sách liên đơn/kép đã được sắp theo một trường

nào đó. Ví dụ theo điểm trung bình. Thêm một nút vào danh sách

liên kết đơn sao cho danh sách mới được tạo vẫn sắp xếp

Bài làm

void sortedInsert(List *L, Node* new_node) {

Node* pp=L->pHead;

/*Neu ds rong hoac nut can them nho hon nut dau*/

if (pp == NULL || pp->infor.MaSV >= new_node->infor.MaSV) {

new_node->link = L->pHead;

L->pHead = new_node;

}
else {

/* Locate the node before the point of insertion */

while (pp->link != NULL && pp->link->infor.MaSV < new_node->infor.MaSV) {

pp = pp->link;

new_node->link = pp->link;

pp->link = new_node;

L->spt++;

You might also like