kiem tien, kiem tien online, kiem tien truc tuyen, kiem tien tren mang
Thứ Sáu, 16 tháng 9, 2011


Các thao tác trên danh sách liên kết đơn(single-link list)
1.Định nghĩa tổng quát
Code:

struct tq {
thtin_t phantu;
struc tq*tiep;
};
typedef struct tq tq_t;

2.Con trỏ tới 1 node
Code:

struct node {
int infor;
struct node *next;
};
typedef struct node *NODEPTR;


3.Cấp phát bộ nhớ cho 1 node
Code:

NODEPTR Getnode(void) {
NODEPTR p;
P = (NODEPTR) malloc(sizeof( struct node));
Return(p);
}

4.Giải phóng 1 node

NODEPTR Freenode( NODEPTR p){
free(p);
}

5.Thêm phần tử vào đỉnh danh sách

void Push_Top( NODEPTR *plist, int x) {
NODEPTR p;
p= Getnode();
p -> infor = x;
p ->next = *plist;
*plist = p;
}

6.Thêm node mới vào cuối danh sách


void Push_Bottom( NODEPTR *plist, int x) {
NODEPTR p, q;
p= Getnode(); //
p->infor = x;
q = *plist;
while (q-> next != NULL)
q = q -> next;

q -> next = p;
p ->next = NULL;
}
7.Thêm node mới vào giữa danh sách

void Push_Before( NODEPTR p, int x ){
NODEPTR q;
if (p->next==NULL)
Push_Bottom(p, x);
else {
q= Getnode();
q -> infor = x;
q-> next = p-> next;
p->next = q;
}
}

8. Xóa 1 node đầu danh sách

void Del_Top( NODEPTR *plist) {
NODEPTR p;
p = *plist;
if (p==NULL) return;
(*plist) = (*plist) -> next;
p-> next = NULL;
Freenode(p);
}

9.Xóa node cuối danh sách

void Del_Bottom(NODEPTR *plist) {
NODEPTR p, q;
if (*plist==NULL) return;
else if ( (*plist)->next==NULL))
Del_Top(plist);
else {
p = *plist;
while (p->next!=NULL){
q = p;
p = p->next;
}
// p lµ node cuèi danh s¸ch;
q->next =NULL;
Freenode(p);
}
}

10.Xóa node giữa danh sách

void Del_before(NODEPTR p){
NODEPTR q;
if (p->next==NULL) return;
q = p ->next;
p->next = q->next;
Freenode(q);
}

Ngoài ra các thao tác duyệt danh sách, tìm kiếm trên danh sách…
Chúng ta xét 1 ứng dụng đơn giản của danh sách liên kết đơn sau;
Chương trình quản lí sinh viên với dạng đơn giản chỉ gồm mã SV và họ tên
#include    <stdio.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <dos.h>
#include    <string.h>
#include     <math.h>
#include <alloc.h>
#define TRUE 1
#define FALSE 0

typedef struct {
    int masv;
    char hoten[20];
} sinhvien;
typedef struct node{
    sinhvien infor;
    struct node *next;
} *NODEPTR;
void Initialize(NODEPTR *plist){
    *plist=NULL;
}
NODEPTR Getnode(void){
    NODEPTR p;
    p=(NODEPTR) malloc(sizeof(struct node));
    return(p);
}
void Freenode(NODEPTR p){
    free(p);
}
int Emptynode(NODEPTR *plist){
    if(*plist==NULL)
        return(TRUE);
    return(FALSE);
}
NODEPTR Inserttop(NODEPTR *plist, sinhvien x){
    NODEPTR p;
    p=Getnode();
    p->infor=x;
    if(Emptynode(plist)){
        p->next=NULL;
        *plist=p;
        return(p);
    }
    p->next=*plist;
    *plist=p;
    return(p);
}
int Bottomnode(NODEPTR *plist){
    int i; NODEPTR p;
    if(Emptynode(plist))
        return(-1);
    p=*plist;i=0;
    while(p!=NULL){
        i=i+1;
        p=p->next;
    }
    return(i);
}
NODEPTR Insertbottom(NODEPTR *plist, sinhvien x){
    NODEPTR p, q;int n,i;
    n=Bottomnode(plist);
    if(n==-1){
        Inserttop(plist,x);
        return(*plist);
    }
    p=*plist;i=0;q=Getnode();q->infor=x;
    while(i<n-1){
        p=p->next;
        i=i+1;
    }
    p->next=q;q->next=NULL;
    delay(2000);return(q);
}
NODEPTR Insertafter(NODEPTR *plist, sinhvien x, int n){
    NODEPTR p,q; int i;
    if(n<0){
        printf("\n Vi tri khong hop le");
        delay(2000);return(NULL);
    }
       p=*plist;i=0;
    while(p!=NULL && i<n){
        i=i+1;
        p=p->next;
    }
    if(p==NULL){
        printf("\n Vi tri khong hop le");
        delay(2000); return(NULL);
    }
    q=Getnode();q->infor=x;
    q->next= p->next;
    p->next=q;
    return(q);
}
void Deltop(NODEPTR *plist){
    NODEPTR p, q;
    p=*plist;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000); return;
    }
    q=p;p=p->next;*plist=p;
    printf("\n Node bi loai bo");
    printf("\n%-5d%-20s",q->infor.masv, q->infor.hoten);
    delay(2000);Freenode(q);
}
void Delbottom(NODEPTR *plist){
    NODEPTR p,q; int i,n;
    n=Bottomnode(plist);
    if(n==-1){
        printf("\n Danh sach rong");
        delay(2000); return;
    }
    if(n==1){
        Deltop(plist);return;
    }
    p=*plist;i=0;
    while(i<n-2){
        p=p->next;
        i=i+1;
    }
    q=p->next;p->next=NULL;
    printf("\n Node duoc loai bo");
    printf("\n %-5d%-20s",q->infor.masv,q->infor.hoten);
    delay(2000); Freenode(q);
}
void Delcurrent(NODEPTR *plist, int n){
    NODEPTR p,q; int i;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000);return;
    }
    if(n==0){
        Deltop(plist); return;
    }
    p=*plist; i=0;
    while(p!=NULL && i<n-1){
        i=i+1;
        p=p->next;
    }
    if(p->next==NULL){
        printf("\n Node khong hop le");
        delay(2000); return;
    }
    q=p->next;p->next=q->next;
    printf("\n Node duoc loai bo");
    printf("\n %-5d%-20s",q->infor.masv, q->infor.hoten);
    delay(2000); Freenode(q);
}
void Travenode(NODEPTR *plist){
    NODEPTR p;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000);return;
    }
    p=*plist;
    while(p!=NULL){
        printf("\n %-5d%-20s",p->infor.masv, p->infor.hoten);
        p=p->next;
    }
    delay(2000);
}
void Sortnode(NODEPTR *plist){
    NODEPTR p,q;sinhvien temp;
    for(p=*plist; p!=NULL; p=p->next){
        for(q=p->next; q!=NULL; q=q->next){
            if(p->infor.masv>q->infor.masv){
                temp=p->infor; p->infor=q->infor;
                q->infor=temp;
            }
        }
    }
    printf("\n Danh sach duoc sap xep");
    for(p=*plist; p!=NULL; p=p->next){
        printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    }
    delay(2000);
}
void Searchnode(NODEPTR *plist, int masv){
    NODEPTR p;
    p=*plist;
    while(p!=NULL && p->infor.masv!=masv)
        p=p->next;
    if(p==NULL)
        printf("\n Node khong ton tai");
    else {
        printf("\n Node can tim");
        printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    }
    delay(2000);
}

void Thuchien(void){
    NODEPTR plist; sinhvien x,y;int vitri; char c;
    Initialize(&plist);
    do {
        clrscr();
        printf("\n THAO TAC VOI SINGLE LINK LIST");
        printf("\n 1- Them node dau danh sach");
        printf("\n 2- Them node cuoi danh sach");
        printf("\n 3- Them node giua danh sach");
        printf("\n 4- Loai bo node dau danh sach");
        printf("\n 5- Loai bo node cuoi danh sach");
        printf("\n 6- Loai node giua danh sach");
        printf("\n 7- Duyet danh sach");
        printf("\n 8- Sap xep danh sach");
        printf("\n 9- Tim kiem danh sach");
        printf("\n 0- Tro ve");
        c=getch();
        switch(c){
            case '1':
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Inserttop(&plist,x); break;
            case '2':
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Insertbottom(&plist,x); break;
            case '3':
                printf("\n Vi tri tren:"); scanf("%d",&vitri);
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Insertafter(&plist,x,vitri-1); break;
            case '4': Deltop(&plist);break;
            case '5': Delbottom(&plist);break;
            case '6':
                fflush(stdin);printf("\n Vi tri loai bo:");
                scanf("%d",&vitri);
                Delcurrent(&plist,vitri-1);break;
            case '7': Travenode(&plist); break;
            case '8': Sortnode(&plist);break;
            case '9':
                fflush(stdin);printf("\n Ma sinh vien:");
                scanf("%d",&vitri);
                Searchnode(&plist, vitri);break;
        }
    } while(c!='0');
}
void main(void){
    Thuchien();
}


#include    <stdio.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <dos.h>
#include    <string.h>
#include     <math.h>
#include <alloc.h>
#define TRUE 1
#define FALSE 0
typedef struct {
    int masv;
    char hoten[20];
} sinhvien;
typedef struct node{
    sinhvien infor;
    struct node *next;
} *NODEPTR;
void Initialize(NODEPTR *plist){
    *plist=NULL;
}
NODEPTR Getnode(void){
    NODEPTR p;
    p=(NODEPTR) malloc(sizeof(struct node));
    return(p);
}
void Freenode(NODEPTR p){
    free(p);
}
int Emptynode(NODEPTR *plist){
    if(*plist==NULL)
        return(TRUE);
    return(FALSE);
}
NODEPTR Inserttop(NODEPTR *plist, sinhvien x){
    NODEPTR p;
    p=Getnode();
    p->infor=x;
    if(Emptynode(plist)){
        p->next=NULL;
        *plist=p;
        return(p);
    }
    p->next=*plist;
    *plist=p;
    return(p);
}
int Bottomnode(NODEPTR *plist){
    int i; NODEPTR p;
    if(Emptynode(plist))
        return(-1);
    p=*plist;i=0;
    while(p!=NULL){
        i=i+1;
        p=p->next;
    }
    return(i);
}
NODEPTR Insertbottom(NODEPTR *plist, sinhvien x){
    NODEPTR p, q;int n,i;
    n=Bottomnode(plist);
    if(n==-1){
        Inserttop(plist,x);
        return(*plist);
    }
    p=*plist;i=0;q=Getnode();q->infor=x;
    while(i<n-1){
        p=p->next;
        i=i+1;
    }
    p->next=q;q->next=NULL;
    delay(2000);return(q);
}
NODEPTR Insertafter(NODEPTR *plist, sinhvien x, int n){
    NODEPTR p,q; int i;
    if(n<0){
        printf("\n Vi tri khong hop le");
        delay(2000);return(NULL);
    }
       p=*plist;i=0;
    while(p!=NULL && i<n){
        i=i+1;
        p=p->next;
    }
    if(p==NULL){
        printf("\n Vi tri khong hop le");
        delay(2000); return(NULL);
    }
    q=Getnode();q->infor=x;
    q->next= p->next;
    p->next=q;
    return(q);
}
void Deltop(NODEPTR *plist){
    NODEPTR p, q;
    p=*plist;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000); return;
    }
    q=p;p=p->next;*plist=p;
    printf("\n Node bi loai bo");
    printf("\n%-5d%-20s",q->infor.masv, q->infor.hoten);
    delay(2000);Freenode(q);
}
void Delbottom(NODEPTR *plist){
    NODEPTR p,q; int i,n;
    n=Bottomnode(plist);
    if(n==-1){
        printf("\n Danh sach rong");
        delay(2000); return;
    }
    if(n==1){
        Deltop(plist);return;
    }
    p=*plist;i=0;
    while(i<n-2){
        p=p->next;
        i=i+1;
    }
    q=p->next;p->next=NULL;
    printf("\n Node duoc loai bo");
    printf("\n %-5d%-20s",q->infor.masv,q->infor.hoten);
    delay(2000); Freenode(q);
}
void Delcurrent(NODEPTR *plist, int n){
    NODEPTR p,q; int i;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000);return;
    }
    if(n==0){
        Deltop(plist); return;
    }
    p=*plist; i=0;
    while(p!=NULL && i<n-1){
        i=i+1;
        p=p->next;
    }
    if(p->next==NULL){
        printf("\n Node khong hop le");
        delay(2000); return;
    }
    q=p->next;p->next=q->next;
    printf("\n Node duoc loai bo");
    printf("\n %-5d%-20s",q->infor.masv, q->infor.hoten);
    delay(2000); Freenode(q);
}
void Travenode(NODEPTR *plist){
    NODEPTR p;
    if(Emptynode(plist)){
        printf("\n Danh sach rong");
        delay(2000);return;
    }
    p=*plist;
    while(p!=NULL){
        printf("\n %-5d%-20s",p->infor.masv, p->infor.hoten);
        p=p->next;
    }
    delay(2000);
}
void Sortnode(NODEPTR *plist){
    NODEPTR p,q;sinhvien temp;
    for(p=*plist; p!=NULL; p=p->next){
        for(q=p->next; q!=NULL; q=q->next){
            if(p->infor.masv>q->infor.masv){
                temp=p->infor; p->infor=q->infor;
                q->infor=temp;
            }
        }
    }
    printf("\n Danh sach duoc sap xep");
    for(p=*plist; p!=NULL; p=p->next){
        printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    }
    delay(2000);
}
void Searchnode(NODEPTR *plist, int masv){
    NODEPTR p;
    p=*plist;
    while(p!=NULL && p->infor.masv!=masv)
        p=p->next;
    if(p==NULL)
        printf("\n Node khong ton tai");
    else {
        printf("\n Node can tim");
        printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    }
    delay(2000);
}

void Thuchien(void){
    NODEPTR plist; sinhvien x,y;int vitri; char c;
    Initialize(&plist);
    do {
        clrscr();
        printf("\n THAO TAC VOI SINGLE LINK LIST");
        printf("\n 1- Them node dau danh sach");
        printf("\n 2- Them node cuoi danh sach");
        printf("\n 3- Them node giua danh sach");
        printf("\n 4- Loai bo node dau danh sach");
        printf("\n 5- Loai bo node cuoi danh sach");
        printf("\n 6- Loai node giua danh sach");
        printf("\n 7- Duyet danh sach");
        printf("\n 8- Sap xep danh sach");
        printf("\n 9- Tim kiem danh sach");
        printf("\n 0- Tro ve");
        c=getch();
        switch(c){
            case '1':
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Inserttop(&plist,x); break;
            case '2':
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Insertbottom(&plist,x); break;
            case '3':
                printf("\n Vi tri tren:"); scanf("%d",&vitri);
                printf("\n Ma sinh vien:");scanf("%d", &x.masv);
                fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
                Insertafter(&plist,x,vitri-1); break;
            case '4': Deltop(&plist);break;
            case '5': Delbottom(&plist);break;
            case '6':
                fflush(stdin);printf("\n Vi tri loai bo:");
                scanf("%d",&vitri);
                Delcurrent(&plist,vitri-1);break;
            case '7': Travenode(&plist); break;
            case '8': Sortnode(&plist);break;
            case '9':
                fflush(stdin);printf("\n Ma sinh vien:");
                scanf("%d",&vitri);
                Searchnode(&plist, vitri);break;
        }
    } while(c!='0');
}
void main(void){
    Thuchien();
}

16 Sep 2011

0 nhận xét:

Đăng nhận xét

:) :)) ;(( :-) =)) ;( ;-( :d :-d @-) :p :o :>) (o) [-( :-? (p) :-s (m) 8-) :-t :-b b-( :-# =p~ $-) (b) (f) x-) (k) (h) (c) cheer
Click to see the code!
To insert emoticon you must added at least one space before the code.

domain, domain name, premium domain name for sales

Bài đăng phổ biến