Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 31 kết quả

Đề tài: Danh sách liên kết đơn - Lý thuyết cơ bản và cách triển khai

  1. #1
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Mặc định Danh sách liên kết đơn - Lý thuyết cơ bản và cách triển khai

    Khác với stack, queue danh sách liên kết đơn cũng là một kiểu danh sách tuyến tính gồm các phần tử vào lần lượt theo thứ tự tuy nhiên nó khác stack và queue ở chỗ là nó được cấp phát trong bộ nhớ bởi các phần tử rời rạc nhau, không nằm kề nhau, tuy nhiên giữa phần tử trước thì có 1 liên kết đến phần tử sau nó.

    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
    C Code:
    1. struct tq {
    2. thtin_t phantu;
    3. struc tq*tiep;
    4. };
    5. typedef struct tq tq_t;

    2.Con trỏ tới 1 node
    C Code:
    1. struct  node {
    2.         int infor;
    3.         struct node *next;
    4.     };
    5.     typedef struct node *NODEPTR;

    3.Cấp phát bộ nhớ cho 1 node
    C Code:
    1. NODEPTR Getnode(void) {
    2.     NODEPTR p;
    3.     P = (NODEPTR) malloc(sizeof( struct node));
    4.     Return(p);
    5. }

    4.Giải phóng 1 node
    C Code:
    1. NODEPTR Freenode( NODEPTR p){
    2.         free(p);
    3.     }

    5.Thêm phần tử vào đỉnh danh sách
    C Code:
    1. void Push_Top( NODEPTR *plist, int x) {
    2.     NODEPTR p;
    3.     p= Getnode();
    4.     p -> infor = x;
    5.     p ->next = *plist;
    6.     *plist = p;
    7. }

    6.Thêm node mới vào cuối danh sách
    C Code:
    1. void Push_Bottom( NODEPTR *plist, int x) {
    2.     NODEPTR p, q;
    3.     p= Getnode(); //
    4.     p->infor = x;
    5.     q = *plist;
    6.     while (q-> next != NULL)
    7.         q = q -> next;
    8.    
    9.     q -> next = p;
    10.     p ->next = NULL;
    11. }

    7.Thêm node mới vào giữa danh sách
    C Code:
    1. void Push_Before( NODEPTR p, int x ){
    2.     NODEPTR q;
    3.     if (p->next==NULL)
    4.         Push_Bottom(p, x);
    5.     else {
    6.         q= Getnode();
    7.         q -> infor = x;
    8.         q-> next = p-> next;    
    9.         p->next = q;
    10.     }
    11. }

    8.Xóa 1 node đầu danh sách
    C Code:
    1. void Del_Top( NODEPTR *plist) {
    2.     NODEPTR p;
    3.     p = *plist;
    4.     if (p==NULL) return;
    5.     (*plist) = (*plist) -> next;
    6.     p-> next = NULL;
    7.     Freenode(p);
    8. }

    9.Xóa node cuối danh sách
    C Code:
    1. void Del_Bottom(NODEPTR *plist) {
    2.     NODEPTR p, q;
    3.     if (*plist==NULL) return;
    4.     else if ( (*plist)->next==NULL))  
    5.         Del_Top(plist);
    6.     else {
    7.         p = *plist;
    8.         while (p->next!=NULL){
    9.             q = p;
    10.             p = p->next;
    11.         }
    12.         // p lµ node cuèi danh s¸ch;
    13.         q->next =NULL;
    14.         Freenode(p);
    15.     }
    16. }

    10.Xóa node giữa danh sách
    C Code:
    1. void Del_before(NODEPTR p){
    2.     NODEPTR q;
    3.     if (p->next==NULL) return;
    4.     q = p ->next;
    5.     p->next = q->next;
    6.     Freenode(q);
    7. }
    Ngoài ra các thao tác duyệt danh sách, tìm kiếm trên danh sách...

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Mặc định Quản lý sinh viên - Ứng dụng của danh sách liên kết đơn

    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

    C Code:
    1. #include    <stdio.h>
    2. #include    <stdlib.h>
    3. #include    <conio.h>
    4. #include    <dos.h>
    5. #include    <string.h>
    6. #include    <math.h>
    7. #include <alloc.h>
    8. #define TRUE 1
    9. #define FALSE 0
    10. typedef struct {
    11.     int masv;
    12.     char hoten[20];
    13. } sinhvien;
    14. typedef struct node{
    15.     sinhvien infor;
    16.     struct node *next;
    17. } *NODEPTR;
    18. void Initialize(NODEPTR *plist){
    19.     *plist=NULL;
    20. }
    21. NODEPTR Getnode(void){
    22.     NODEPTR p;
    23.     p=(NODEPTR) malloc(sizeof(struct node));
    24.     return(p);
    25. }
    26. void Freenode(NODEPTR p){
    27.     free(p);
    28. }
    29. int Emptynode(NODEPTR *plist){
    30.     if(*plist==NULL)
    31.         return(TRUE);
    32.     return(FALSE);
    33. }
    34. NODEPTR Inserttop(NODEPTR *plist, sinhvien x){
    35.     NODEPTR p;
    36.     p=Getnode();
    37.     p->infor=x;
    38.     if(Emptynode(plist)){
    39.         p->next=NULL;
    40.         *plist=p;
    41.         return(p);
    42.     }
    43.     p->next=*plist;
    44.     *plist=p;
    45.     return(p);
    46. }
    47. int Bottomnode(NODEPTR *plist){
    48.     int i; NODEPTR p;
    49.     if(Emptynode(plist))
    50.         return(-1);
    51.     p=*plist;i=0;
    52.     while(p!=NULL){
    53.         i=i+1;
    54.         p=p->next;
    55.     }
    56.     return(i);
    57. }
    58. NODEPTR Insertbottom(NODEPTR *plist, sinhvien x){
    59.     NODEPTR p, q;int n,i;
    60.     n=Bottomnode(plist);
    61.     if(n==-1){
    62.         Inserttop(plist,x);
    63.         return(*plist);
    64.     }
    65.     p=*plist;i=0;q=Getnode();q->infor=x;
    66.     while(i<n-1){
    67.         p=p->next;
    68.         i=i+1;
    69.     }
    70.     p->next=q;q->next=NULL;
    71.     delay(2000);return(q);
    72. }
    73. NODEPTR Insertafter(NODEPTR *plist, sinhvien x, int n){
    74.     NODEPTR p,q; int i;
    75.     if(n<0){
    76.         printf("\n Vi tri khong hop le");
    77.         delay(2000);return(NULL);
    78.     }
    79.     p=*plist;i=0;
    80.     while(p!=NULL && i<n){
    81.         i=i+1;
    82.         p=p->next;
    83.     }
    84.     if(p==NULL){
    85.         printf("\n Vi tri khong hop le");
    86.         delay(2000); return(NULL);
    87.     }
    88.     q=Getnode();q->infor=x;
    89.     q->next= p->next;
    90.     p->next=q;
    91.     return(q);
    92. }
    93. void Deltop(NODEPTR *plist){
    94.     NODEPTR p, q;
    95.     p=*plist;
    96.     if(Emptynode(plist)){
    97.         printf("\n Danh sach rong");
    98.         delay(2000); return;
    99.     }
    100.     q=p;p=p->next;*plist=p;
    101.     printf("\n Node bi loai bo");
    102.     printf("\n%-5d%-20s",q->infor.masv, q->infor.hoten);
    103.     delay(2000);Freenode(q);
    104. }
    105. void Delbottom(NODEPTR *plist){
    106.     NODEPTR p,q; int i,n;
    107.     n=Bottomnode(plist);
    108.     if(n==-1){
    109.         printf("\n Danh sach rong");
    110.         delay(2000); return;
    111.     }
    112.     if(n==1){
    113.         Deltop(plist);return;
    114.     }
    115.     p=*plist;i=0;
    116.     while(i<n-2){
    117.         p=p->next;
    118.         i=i+1;
    119.     }
    120.     q=p->next;p->next=NULL;
    121.     printf("\n Node duoc loai bo");
    122.     printf("\n %-5d%-20s",q->infor.masv,q->infor.hoten);
    123.     delay(2000); Freenode(q);
    124. }
    125. void Delcurrent(NODEPTR *plist, int n){
    126.     NODEPTR p,q; int i;
    127.     if(Emptynode(plist)){
    128.         printf("\n Danh sach rong");
    129.         delay(2000);return;
    130.     }
    131.     if(n==0){
    132.         Deltop(plist); return;
    133.     }
    134.     p=*plist; i=0;
    135.     while(p!=NULL && i<n-1){
    136.         i=i+1;
    137.         p=p->next;
    138.     }
    139.     if(p->next==NULL){
    140.         printf("\n Node khong hop le");
    141.         delay(2000); return;
    142.     }
    143.     q=p->next;p->next=q->next;
    144.     printf("\n Node duoc loai bo");
    145.     printf("\n %-5d%-20s",q->infor.masv, q->infor.hoten);
    146.     delay(2000); Freenode(q);
    147. }
    148. void Travenode(NODEPTR *plist){
    149.     NODEPTR p;
    150.     if(Emptynode(plist)){
    151.         printf("\n Danh sach rong");
    152.         delay(2000);return;
    153.     }
    154.     p=*plist;
    155.     while(p!=NULL){
    156.         printf("\n %-5d%-20s",p->infor.masv, p->infor.hoten);
    157.         p=p->next;
    158.     }
    159.     delay(2000);
    160. }
    161. void Sortnode(NODEPTR *plist){
    162.     NODEPTR p,q;sinhvien temp;
    163.     for(p=*plist; p!=NULL; p=p->next){
    164.         for(q=p->next; q!=NULL; q=q->next){
    165.             if(p->infor.masv>q->infor.masv){
    166.                 temp=p->infor; p->infor=q->infor;
    167.                 q->infor=temp;
    168.             }
    169.         }
    170.     }
    171.     printf("\n Danh sach duoc sap xep");
    172.     for(p=*plist; p!=NULL; p=p->next){
    173.         printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    174.     }
    175.     delay(2000);
    176. }
    177. void Searchnode(NODEPTR *plist, int masv){
    178.     NODEPTR p;
    179.     p=*plist;
    180.     while(p!=NULL && p->infor.masv!=masv)
    181.         p=p->next;
    182.     if(p==NULL)
    183.         printf("\n Node khong ton tai");
    184.     else {
    185.         printf("\n Node can tim");
    186.         printf("\n %-5d%-20s",p->infor.masv,p->infor.hoten);
    187.     }
    188.     delay(2000);
    189. }
    190.  
    191. void Thuchien(void){
    192.     NODEPTR plist; sinhvien x,y;int vitri; char c;
    193.     Initialize(&plist);
    194.     do {
    195.         clrscr();
    196.         printf("\n THAO TAC VOI SINGLE LINK LIST");
    197.         printf("\n 1- Them node dau danh sach");
    198.         printf("\n 2- Them node cuoi danh sach");
    199.         printf("\n 3- Them node giua danh sach");
    200.         printf("\n 4- Loai bo node dau danh sach");
    201.         printf("\n 5- Loai bo node cuoi danh sach");
    202.         printf("\n 6- Loai node giua danh sach");
    203.         printf("\n 7- Duyet danh sach");
    204.         printf("\n 8- Sap xep danh sach");
    205.         printf("\n 9- Tim kiem danh sach");
    206.         printf("\n 0- Tro ve");
    207.         c=getch();
    208.         switch(c){
    209.             case '1':
    210.                 printf("\n Ma sinh vien:");scanf("%d", &x.masv);
    211.                 fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
    212.                 Inserttop(&plist,x); break;
    213.             case '2':
    214.                 printf("\n Ma sinh vien:");scanf("%d", &x.masv);
    215.                 fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
    216.                 Insertbottom(&plist,x); break;
    217.             case '3':
    218.                 printf("\n Vi tri tren:"); scanf("%d",&vitri);
    219.                 printf("\n Ma sinh vien:");scanf("%d", &x.masv);
    220.                 fflush(stdin); printf("\n Ho va ten:");gets(x.hoten);
    221.                 Insertafter(&plist,x,vitri-1); break;
    222.             case '4': Deltop(&plist);break;
    223.             case '5': Delbottom(&plist);break;
    224.             case '6':
    225.                 fflush(stdin);printf("\n Vi tri loai bo:");
    226.                 scanf("%d",&vitri);
    227.                 Delcurrent(&plist,vitri-1);break;
    228.             case '7': Travenode(&plist); break;
    229.             case '8': Sortnode(&plist);break;
    230.             case '9':
    231.                 fflush(stdin);printf("\n Ma sinh vien:");
    232.                 scanf("%d",&vitri);
    233.                 Searchnode(&plist, vitri);break;
    234.         }
    235.     } while(c!='0');
    236. }
    237. void main(void){
    238.     Thuchien();
    239. }

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Cho mình bổ sung nhé bạn PoPo.. , thông thường thì người ta xây dựng stack, queue bằng mảng, nhưng điểm hạn chế là nó sẽ bị giới hạn về số lượng phần tử, bởi thế cách hay nhất là xây dựng stack, queue bẳng danh sách liên kết đơn ==> stack, queue là 1 danh sách liên kết đơn.
    Bài tập ví dụ của bạn rất hay, những bài kiểu này ở trường neverland cũng được làm. Ở bài này, ta rút ra được ứng dụng của DSLK đơn là: giúp ta giải quyết được nhược điểm cố hữu của mảng là luôn bị giới hạn về kích thước.

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Uhm Rất cảm ơn neverland!
    Ý kiến của bạn hoàn toàn rất hợp lí, và trên thực tế người ta sử dụng luôn DSLK luôn chứ không dùng DSLK để xây dựng stack hay queue.

    Tuy nhiên để làm rõ vấn đề này mình cũng sẽ post code về cách xây dựng stach bằng DSLK đơn (Có thề kép cũng được).

    Việc xây dựng stack trên DSLK đơn là hoàn toàn đơn giản, thao tác nhập phần tử vào stack tương ứng với thao tác chèn phần tử vào đầu DSLK, lấy phân tử ra khỏi stack thì tương ứng với thao tác đọc phần tử đầu DSLK.
    Nghĩa là bạn khởi tạo một DSLK rỗng và làm các thao tác chèn phần từ vào đầu và đọc phần tử ở đầu DS mà thôi!

  5. #5
    Ngày gia nhập
    05 2011
    Bài viết
    1

    Mọi người xem hộ bài này cái
    không dùng mấy hàm void mà dùng Node*.........
    Attached Files Attached Files

  6. #6
    Ngày gia nhập
    04 2011
    Bài viết
    2

    Mặc định Danh sách liên kết đơn - Lý thuyết cơ bản và cách triển khai

    ... rất rất cảm ơn PoPoPoPo đã có 1 bài viết như thế này ...

  7. #7
    Ngày gia nhập
    11 2011
    Bài viết
    3

    Cho em hỏi vài thứ:
    Câu này có ý nghĩa gì ???: l.ptial=l.ptail->pRev;
    Câu này có ý nghĩa là gì??: l.ptial->pnext = null;
    Câu này có ý nghĩa là gì??: p->pnext->pPrev=q;
    Câu này có ý nghĩa là gì??: q->pPrev=p->pRev;
    Em có đoạn khai báo:
    Typedef struct tagNode//câu này để làm gì??
    {
    Data Infor;// câu này để làm gì??
    Struct tagNode* pNext;// câu này để làm gì??
    } node;//chử node nghĩa là gì??
    Anh chị nào rành giúp dùm em. Sắp thi rùi mà không biết gì hết.

  8. #8
    Ngày gia nhập
    01 2011
    Nơi ở
    -Mountain-
    Bài viết
    767

    Trích dẫn Nguyên bản được gửi bởi quocanit_1992 Xem bài viết
    Cho em hỏi vài thứ:
    Câu này có ý nghĩa gì ???: l.ptial=l.ptail->pRev;
    Câu này có ý nghĩa là gì??: l.ptial->pnext = null;
    Câu này có ý nghĩa là gì??: p->pnext->pPrev=q;
    Câu này có ý nghĩa là gì??: q->pPrev=p->pRev;
    Em có đoạn khai báo:
    Typedef struct tagNode//câu này để làm gì??
    {
    Data Infor;// câu này để làm gì??
    Struct tagNode* pNext;// câu này để làm gì??
    } node;//chử node nghĩa là gì??
    Anh chị nào rành giúp dùm em. Sắp thi rùi mà không biết gì hết.
    Lần sau trích dẫn thì bạn trích dẫn bài cho đầy đủ chứ post một loạt biến lên đây thì ai hiểu nó là cái gì đâu ?
    ở đây chỉ là danh sách liên kết kép thôi. next chỉ phần tử tiếp theo, prev thì con trỏ trỏ phần tử trước nó


    Typedef struct tagNode//câu này để làm gì??
    {
    Data Infor;// câu này để làm gì??
    Struct tagNode* pNext;// câu này để làm gì??
    } node;//chử node nghĩa là gì??
    Cái này bạn hỏi thì bạn về đọc lại toàn bộ lý thuyết về struct nhé

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    4

    Mọi người giúp em sửa bài này với, lỗi ở hàm sửa, thêm, xóa, và giúp em viết thêm hàm đếm số lượng với
    C Code:
    1. //File:quanliSV.c
    2. //Chuong trinh quan li sinh vien so cap
    3. //Input: cac thong tin cua sinh vien nhap vao tu ban phim
    4. //Ouput: in ra danh sach sinh vien va thuc hien mot so chuc nang
    5. //------------------------------------------------------------------------------
    6. //Class:                                Instructor:
    7. //Assignment:                           Date assigned:
    8. //Programmer:                           Date completed:
    9.  
    10. #include<stdio.h>
    11. #include<conio.h>
    12. #include<string.h>
    13. #include<malloc.h>
    14.  
    15. /*dinh nghia cac gia tri ma nguoi dung co the chon*/
    16. #define kiHieu (1,2,3,4,5,0)
    17.  
    18. //Cau truc cua mot sinh vien
    19. typedef struct pp{
    20.     char ht[20];
    21.     char que[20];
    22.     char maSoSV[20];
    23.     struct pp *next;
    24. }sinhVien;
    25.  
    26. //Ham nhap danh sach sinh vien
    27. void nhapSV(sinhVien **pdau,int *n);
    28.  
    29. //Ham sua thong tin cua mot sinh vien trong danh sach
    30. void suaSV(sinhVien *pdau,int *n);
    31.  
    32. //Ham them sinh vien vao trong danh sach
    33. void themSV(sinhVien *pdau,int *n);
    34.  
    35. //Ham xoa sinh vien trong danh sach
    36. void xoaSV(sinhVien *pdau,int *n);
    37.  
    38. //Ham tim kiem thong tin ve 1 sinh vien trong danh sach
    39. void timSV(sinhVien *pdau,int *n);
    40.  
    41. //Ham in ra danh sach cac sinh vien duoc quan li trong danh sach
    42. void inSV(sinhVien *pdau,int *n);
    43.  
    44. //Ham main
    45. main()
    46. {
    47.     //Khai bao dia chi cua sinh vien dau tien
    48.     sinhVien *pdau = NULL;
    49.     int n=0;
    50.     int chon;
    51.     //Nhap danh sach sinh vien ban dau
    52.     nhapSV(&pdau,&n);
    53.    
    54.     printf("Ban hay chon cac phim tuong ung voi cac chuc nang sau:\n\
    55.    Phim 1 de thuc hien sua thong tin cua mot sinh vien trong danh sach\n\
    56.    Phim 2 de thuc hien them 1 sinh vien vao trong danh sach\n\
    57.    Phim 3 de xoa 1 sinh vien trong danh sach\n\
    58.    Phim 4 de tim kiem 1 sinh vien trong danh sach\n\
    59.    Phim 5 de in ra thong tin cac sinh vien trong danh sach\n\
    60.    Phim 0 de thoat khoi chuong trinh\n");
    61.     printf("Chon: "); scanf("%d",&chon);
    62.     //Kiem tra so ma nguoi dung nhap vao co hop le hay khong
    63.     while(chon > 5 || chon < 0){
    64.         printf("So ban nhap khong hop le!\n Xin ban nhap lai: ");
    65.         scanf("%d",&chon);
    66.     }
    67.     //Xoa luong du lieu vao
    68.     fflush(stdin);
    69.     //Cac chuc nang tuong ung voi cac so
    70.     switch(chon){
    71.         case 0:
    72.             exit(0);
    73.         case 1:
    74.             suaSV(pdau,&n);
    75.         case 2:
    76.             themSV(pdau,&n);
    77.         case 3:
    78.             xoaSV(pdau,&n);
    79.         case 4:
    80.             timSV(pdau,&n);
    81.         case 5:
    82.             inSV(pdau,&n);
    83.     }
    84.     getch();
    85. }
    86.  
    87. //Ham nhap danh sach sinh vien
    88. void nhapSV(sinhVien **pdau,int *n)
    89. {
    90.     sinhVien *p;
    91.     char ht[20];
    92.     //tao danh sach sinh vien
    93.     while(1){
    94.  
    95.         //Nhap ten sinh vien roi kiem tra
    96.         printf("Hay nhap ten cua sinh vien: ");
    97.         //Kiem tra xem ten sinh vien co the them vao danh sach duoc hay khong
    98.         gets(ht);
    99.         if(ht[0]==0){
    100.             break;
    101.         }
    102.         //Kiem tra xem dau danh sach da co phan tu nao chua
    103.         //Neu chua co thi se tao ra phan tu dau tien
    104.         if(*pdau==NULL){
    105.             //Cap phat bo nho cho phan tu dau tien
    106.             *pdau=(sinhVien*)malloc(sizeof(sinhVien));
    107.             p=*pdau;
    108.             strcpy(p->ht,ht);
    109.             printf("Nhap que cua sinh vien: ");
    110.             gets(p->que);
    111.             printf("Ma so sinh vien: ");
    112.             gets(p->maSoSV);
    113.             p->next = NULL;
    114.             *n++;
    115.         }else{
    116.             //Thuc hien tao cac phan tu tiep theo cua danh sach
    117.             //Den khi nguoi dung khong nhap nua
    118.             p->next=(sinhVien*)malloc(sizeof(sinhVien));
    119.             p=p->next;
    120.             /*printf("Hay nhap ten cua sinh vien nay: ");
    121.             gets(ht);
    122.             if(ht==0){
    123.                 break;
    124.             }*/
    125.             strcpy(p->ht,ht);
    126.             printf("Que quan: ");
    127.             gets(p->que);
    128.             printf("Ma so sinh vien: ");
    129.             gets(p->maSoSV);
    130.             p->next = NULL;
    131.             *n++;
    132.         }
    133.     }
    134.     return;
    135. }
    136.  
    137. //Ham sua thong tin cua mot sinh vien  
    138. void suaSV(sinhVien *pdau,int *n)
    139. {
    140.     //Con tro chua vi tri cua sinh vien dang kiem tra
    141.     sinhVien *p;
    142.     int kiemTra=1;
    143.     char ht[20];
    144.     char c;
    145.     printf("Hay nhap ten cua sinh vien can sua thong tin: ");
    146.     gets(ht);
    147.     while(1){
    148.         if(ht==0){
    149.             return;
    150.         }
    151.         if(strcmp(p->ht,ht)==0){
    152.             break;
    153.         }
    154.         if(p->next!=NULL){
    155.             p=p->next;
    156.             kiemTra=1;
    157.         }else{
    158.             kiemTra=0;
    159.             break;
    160.         }
    161.     }
    162.     if(kiemTra=0){
    163.         printf("Khong so sinh vien nao co ten nhu ban vua nhap!");
    164.     }else{
    165.         printf("Ban muon sau thong tin gi cua sinh vien nay:\n\
    166.        Chon 1 de sua ten\n\
    167.        Chon 2 de sua que quan\n\
    168.        Chon 3 de sua ma so sinh vien.");
    169.         c=getch();
    170.         while(c!=kiHieu){
    171.             printf("So ban nhap khong hop le!\n\
    172.            Xin hay nhap lai hoac an 0 de thoat");
    173.         }
    174.         while(c!='0'){
    175.             switch(c){
    176.                 case 0:
    177.                     exit(0);
    178.                 case 1:
    179.                     printf("Hay nhap ten moi ban muon sua:");
    180.                     gets(p->ht);
    181.                 case 2:
    182.                     printf("Hay nhap que moi ban muon sua:");
    183.                     gets(p->que);
    184.                 case 3:
    185.                     printf("Hay nhap ma so sinh vien moi:");
    186.                     gets(p->maSoSV);
    187.             }
    188.             printf("Ban muon thuc hien sua thong tin gi nua khong\n\
    189.            Hay chon so tuong ung muon thuc hien hoac an so 0 de thoat");
    190.             c=getch();
    191.         }
    192.     }
    193. }
    194.  
    195. //Ham them 1 sinh vien vao danh sach
    196. void themSV(sinhVien *pdau,int *n)
    197. {
    198.     sinhVien *p;
    199.     char ht[20];
    200.     printf("Ban hay nhap ten cua sinh vien muon them vao danh sach:");
    201.     gets(ht);
    202.     if(ht==0){
    203.         exit(0);
    204.     }
    205.     p=pdau;
    206.     while(p!=NULL){
    207.         p=p->next;
    208.     }
    209.     p->next=(sinhVien*)malloc(sizeof(sinhVien));
    210.     p=p->next;
    211.     strcpy(p->ht,ht);
    212.     printf("Nhap que cua sinh vien moi: ");
    213.     gets(p->que);
    214.     printf("Nhap ma so cua sinh vien moi: ");
    215.     gets(p->maSoSV);
    216. }
    217.  
    218. //Ham xoa mot sinh vien trong danh sach
    219. void xoaSV(sinhVien *pdau,int *n)
    220. {
    221.     sinhVien *p=pdau,*luu;
    222.     char ht[20];
    223.     printf("Ban hay nhap ten cua sinh vien can xoa khoi danh sach: ");
    224.     gets(ht);
    225.     if(ht==0){
    226.         exit(0);
    227.     }
    228.     if(pdau==NULL){
    229.         printf("Danh sach khong co ai nen tim kiem khong thanh cong!");
    230.         exit(0);
    231.     }
    232.     while(p!=NULL){
    233.         if(strcmp(p->ht,ht)==0){
    234.             break;
    235.         }else{
    236.             if(p->next!=NULL){
    237.                 luu=p;
    238.                 p=p->next;
    239.             }else{
    240.                 exit(0);
    241.             }
    242.         }
    243.     }
    244.     if(p->next==NULL){
    245.         luu->next=NULL;
    246.     }else{
    247.         luu->next=p->next;
    248.     }
    249. }
    250.  
    251. //Ham tim kiem 1 sinh vien trong danh sach theo ten
    252. void timSV(sinhVien *pdau,int *n)
    253. {
    254.     sinhVien *p=pdau;
    255.     char ht[20];
    256.     printf("Nhap ten sinh vien ban muon tim trong danh sach: ");
    257.     gets(ht);
    258.     if(pdau==NULL){
    259.         printf("Danh sach chong nen tim kiem khong thuc hien!");
    260.         exit(0);
    261.     }
    262.     while(p!=NULL){
    263.         if(strcmp(p->ht,ht)==0){
    264.             break;
    265.         }else{
    266.             if(p->next!=NULL){
    267.                 p=p->next;
    268.             }else{
    269.                 printf("Khong co sinh vien nao ten nhu ban vua nhap!");
    270.                 exit(0);
    271.             }
    272.         }
    273.     }
    274.     printf("Thong tin cua sinh vien ban vua nhap vao la: ");
    275.     printf("ten: %s \nQue quan: %s\nMa so sinh vien: %s",p->ht,p->que,p->maSoSV);
    276. }
    277.  
    278. //Ham in ra danh sach cac sinh sien
    279. void inSV(sinhVien *pdau,int *n)
    280. {
    281.     sinhVien *p=pdau;
    282.     printf("%-30s%-30s%-30s\n","Ten sinh vien","Que quan","Ma so sinh vien");
    283.     while(p!=NULL){
    284.         printf("%-30s%-30s%-30s\n",p->ht,p->que,p->maSoSV);
    285.         p=p->next;
    286.     }
    287. }
    288. //End

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    549

    Hàm Sửa :
    Con trỏ p mới vào chả trỏ đi đâu cả. Cho nên mặc nhiên mấy cái thứ ở dưới là ERROR rồi.
    C++ Code:
    1.  //Con tro chua vi tri cua sinh vien dang kiem tra
    2.     sinhVien *p;
    3. // Chứa chỗ nào?
    Còn nữa : Viết lại cái hàm while cho đàng hoàng, viết gì lủng củng thế. while(1) break là cái thứ nên hạn chế dùng.

    Còn nữa :
    C++ Code:
    1. c=getch();
    2.         while(c!=kiHieu){
    3.             printf("So ban nhap khong hop le!\n\
    4.            Xin hay nhap lai hoac an 0 de thoat");
    5.  //Đoạn này có nguy cơ lặp vào giấc mê ngàn thu.
    6.         }


    Đây nữa :
    C++ Code:
    1. while(c!='0'){
    2.             switch(c){
    3.                 case 0: // Ký tự NULL này nhập = cách nào @@? Kiểm tra làm gì
    4.                     exit(0);
    5.                 case 1: // Ký tự có mã ASCII là 1 này là cái gì chả ai biết
    6.                     printf("Hay nhap ten moi ban muon sua:");
    7.                     gets(p->ht);
    8.                 case 2: // Tương tự
    9.                     printf("Hay nhap que moi ban muon sua:");
    10.                     gets(p->que);
    11.                 case 3:
    12.                     printf("Hay nhap ma so sinh vien moi:");
    13.                     gets(p->maSoSV);
    14.             }
    15.             printf("Ban muon thuc hien sua thong tin gi nua khong\n\
    16.            Hay chon so tuong ung muon thuc hien hoac an so 0 de thoat");
    17.             c=getch();
    18.         }
    ________________________
    Hàm Thêm
    C++ Code:
    1. void themSV(sinhVien *pdau,int *n)
    2. {
    3.     sinhVien *p;
    4.     char ht[20];
    5.     printf("Ban hay nhap ten cua sinh vien muon them vao danh sach:");
    6.     gets(ht);
    7.     if(ht==0){
    8.         exit(0);
    9.     }
    10.     p=pdau;
    11.     while(p!=NULL){
    12.         p=p->next;
    13.     }
    14. // Khi out khỏi vòng lặp này, p sẽ là NULL
    15.     p->next=(sinhVien*)malloc(sizeof(sinhVien));
    16. // Vì p NULL cho nên sẽ ko có p->next trỏ niếc gì hết. ERROR ở chỗ này
    17.     p=p->next;
    18.  ....
    19. blah blah
    20. }

    _________________
    Ở hàm xóa :
    XÓa phần tử sao ko thấy lệnh free hay delete gì để giải phóng ô nhớ? Đâu phải ngắt liên kết nó ra khỏi list là xong đâu. Thả rác trôi vật vờ trên sông rồi ai vớt
    Đã được chỉnh sửa lần cuối bởi clchicken : 24-12-2011 lúc 08:22 PM.
    Um Mani Padme Hum...!!

Các đề tài tương tự

  1. cách sử dụng danh sách liên kết khai báo cây nhị phân trong C++
    Gửi bởi huunhan577 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 21-03-2013, 09:43 AM
  2. Con trỏ trên C Các cách khai báo con trỏ trong danh sách liên kết đơn?
    Gửi bởi vandt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 11-09-2012, 09:39 AM
  3. Định nghĩa kiểu dữ liệu khi khai báo cấu trúc danh sách liên kết đơn
    Gửi bởi nguyenquanghung trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 13-05-2011, 12:39 AM
  4. Nhập và xuất danh sách liên kết lồng danh sách liên kết?
    Gửi bởi nvluong_it trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 22-04-2011, 11:30 AM
  5. khai báo danh sách liên kết đơn
    Gửi bởi HaNguyen trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 19-10-2010, 05:14 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn