Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 18 kết quả

Đề tài: lấy phần tử trong danh sách liên kết

  1. #1
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    Mặc định lấy phần tử trong danh sách liên kết

    có ai giải thích cách lấy phần tử đầu hoặc cuối hay giữa trong danh sách liên kết đơn giúp mình ko

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Bạn xây dựng danh sách đơn thế nào? Code đâu post câu hỏi không thế này à? Có chúa mới biết được.

    Nếu bạn xây dựng 1 node như sau:
    C Code:
    1. typedef struct _Node
    2. {
    3.     int     data;
    4.     _Node   *next;
    5. }Node;
    Thì phải lưu lại con trỏ trỏ vào nút đầu tiên của danh sách (phần tử đầu).
    Duyệt danh sách theo kiểu node = node->next, đến khi nào node->next == NULL (nhớ gán lúc thêm node mới) thì node đó là phần tử cuối cùng.
    Đã được chỉnh sửa lần cuối bởi doicanhden : 22-04-2012 lúc 07:12 PM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    mình có làm bài tính biểu thức hậu tố bằng danh sách liên kết dựa trên bài cũ làm bằng stack nhưng mà tới cái đoạn lấy phần tử đầu thì bí ko biết lấy ra sao nên ko dám up code lên cho mọi người xem tại ocde ko hoàn chỉnh mà
    code chưa hoàn chỉnh có nhiu mình up nhiu thôi :(
    Code:
    typedef struct node 
    {
    	float S[50];
    	int infor;
    	int top;
    	struct node *next;
    }*NODEPTR;
    // toán tử
    int LaToanTu(char c)
    {
        if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='^')) return 1;
        else return 0;
    }
    //thêm ký tự
    char *ThemKyTu (char *p, char c)
    {
         int DoDai;
         DoDai=strlen(p);
         p[DoDai]=c;
         p[DoDai+1]='\0';
         return p;
    }
    // tạo danh sách
    void initialize ( NODEPTR *plist)
    {
    	*plist = NULL;
    }
    //cấp pháp bộ nhớ 1 node
    NODEPTR getnode (void)
    {
    	NODEPTR p;
    	p = (NODEPTR) malloc(sizeof( struct node));
        return(p);
    }
    // giải phóng 1 node
    void freenode ( NODEPTR p)
    {
    	free(p);
    }
    // kiểm tra danh sách 
    int emptynode (NODEPTR *plist)
    {
    	if ( *plist == NULL )
    	{
    		return (TRUE);
    	}
    	return (FALSE);
    }
    // thêm  phần tử vào đầu danh sách
    void push_top ( NODEPTR *plist , int x)
    {
    	NODEPTR p;
    	p = getnode();
    	p-> infor = x;
    	p->next = *plist;
    	*plist = p;
    }
    void pop_top(NODEPTR *plist,float x)
    {
     // phần lấy phần tử đầu mình bí 
    }
    // thêm phần tử 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;
    }
    float tinhHT ( char *p)
    {
    	NODEPTR plist;
    	initialize(&plist);
    	int dodai;
    	float so , so1 , so2 , tong;
    	int i ;
    	char Tam[MAX];
    	dodai = strlen(p);
    	Tam[0] = '\0';
    	for ( i = 0 ; i < dodai ; i++)
    	{
    		if(p[i] == ' ')
    		{
    			if(Tam[0] != '\0')
    			{
    				so = atoi(Tam);
    				push_top(&plist , so);
    				Tam[0] = '\0';
    			}
    		}
    		else
    		{
    			if(LaToanTu(p[i]))
    			{
    				if(Tam[0] != '\0')
    				{
    					so = atoi(Tam);
    					push_top(&plist , so);
    					Tam[0] = '\0';
    				}
    				pop_top(&plist , so2);
    				pop_top(&plist , so1);
    				switch(p[i])
    				{
    					case '+': tong = so1 + so2; break;
    					case '-': tong = so1 - so2; break;
    					case '*': tong = so1 * so2; break;
    					case '/': tong = so1 / so2; break;
    					case '^': tong = pow(so1,so2); break;
    				}
    				push_top(&plist , tong);
    			}
    			else
    				ThemKyTu(Tam , p[i]);
    		}
    	}
    	pop_top(&plist , tong);
    	printf("Ket qua:");
    	printf("&.2f",tong);
    	return tong;
    }

  4. #4
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    có ai giúp mình ko

  5. #5
    Ngày gia nhập
    03 2012
    Bài viết
    6

    Mình giả sử code bạn đúng hết , thêm pop_top nữa là xong

    Code:
    void pop_top(NODEPTR plist)//dùng con trỏ cấp 1 cho đơn giản, ko cần thiết dùng con trỏ cấp 2
    {
         if(plist!=NULL)
        {
             plist = plist->next;
        }
    }

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định lấy phần tử trong danh sách liên kết

    Sửa cho bác cách cài đặt stack dùng danh sách liên kết đơn. Còn code và thuật toán của bác tính biểu thức hậu tố. Tôi góp ý là nên xem lại đi. Code quá tệ, nhìn rối mù. :-|
    C Code:
    1. typedef struct _Node
    2. {
    3.     float           data;
    4.     struct _Node    *next;
    5. }Node, *PNode;
    6. //cấp pháp bộ nhớ 1 node
    7. PNode newNode()
    8. {
    9.     return (PNode)malloc(sizeof(Node));
    10. }
    11. // giải phóng 1 node
    12. void deleteNode (PNode lpNode)
    13. {
    14.     free(lpNode);
    15. }
    16. // kiểm tra danh sách
    17. int isEmpty(PNode list)
    18. {
    19.     return (list == NULL);
    20. }
    21. // thêm  phần tử vào đầu danh sách
    22. void push_top(PNode *list, float data)
    23. {
    24.     PNode node = newNode();
    25.     node->data = data;
    26.     node->next = *list;
    27.  
    28.     *list = node;
    29. }
    30. // thêm phần tử vào cuối danh sách
    31. void push_bottom(PNode *list, float data)
    32. {
    33.     if(list)
    34.     {
    35.         PNode last = NULL;
    36.         for(last = *list; last->next != NULL; last = last->next);
    37.  
    38.         last->next = newNode();
    39.         last->next->data = data;
    40.     }
    41.     else
    42.     {
    43.         *list = newNode();
    44.         (*list)->data = data;
    45.     }
    46. }
    47. float pop_top(PNode *list)
    48. {
    49.     PNode top = *list;
    50.     float data = top->data;
    51.  
    52.     *list = top->next;
    53.  
    54.     deleteNode(top);
    55.     return data;
    56. }
    57. // toán tử
    58. int isOperator(char c)
    59. {
    60.     return ( (c=='+') || (c == '-') || (c=='*') || (c=='/') || (c=='^'));
    61. }
    62. //thêm ký tự
    63. char *ThemKyTu (char *p, char c)
    64. {
    65.         int DoDai;
    66.         DoDai = strlen(p);
    67.         p[DoDai]=c;
    68.         p[DoDai + 1]='\0';
    69.         return p;
    70. }
    71.  
    72. float tinhHT (char *p)
    73. {
    74.     PNode list = NULL;
    75.  
    76.     int dodai;
    77.     float so , so1 , so2 , tong;
    78.     int i ;
    79.     char Tam[256];
    80.     dodai = strlen(p);
    81.     Tam[0] = '\0';
    82.     for (int i = 0 ; i < dodai; ++i)
    83.     {
    84.         if(p[i] == ' ')
    85.         {
    86.             if(Tam[0] != '\0')
    87.             {
    88.                 so = atoi(Tam);
    89.                 push_top(&list , so);
    90.                 Tam[0] = '\0';
    91.             }
    92.         }
    93.         else
    94.         {
    95.             if(isOperator(p[i]))
    96.             {
    97.                 if(Tam[0] != '\0')
    98.                 {
    99.                     so = atoi(Tam);
    100.                     push_top(&list, so);
    101.                     Tam[0] = '\0';
    102.                 }
    103.                 so2 = pop_top(&list);
    104.                 so1 = pop_top(&list);
    105.                 switch(p[i])
    106.                 {
    107.                     case '+': tong = so1 + so2; break;
    108.                     case '-': tong = so1 - so2; break;
    109.                     case '*': tong = so1 * so2; break;
    110.                     case '/': tong = so1 / so2; break;
    111.                     case '^': tong = pow(so1,so2); break;
    112.                 }
    113.                 push_top(&list , tong);
    114.             }
    115.             else
    116.                 ThemKyTu(Tam , p[i]);
    117.         }
    118.     }
    119.     tong = pop_top(&list);
    120.     printf("Ket qua:");
    121.     printf("&.2f",tong);
    122.     return tong;
    123. }
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  7. #7
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    hix cảm ơn bác học cái này chưa vững nữa nên thiếu sai sót tùm lum :(

  8. #8
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    bác ơi đoạn
    Code:
    float data = top->data;
    bị sai thì phải
    hay do mình chưa tạo cái deletenode ?
    Đã được chỉnh sửa lần cuối bởi yokashi : 22-04-2012 lúc 10:32 PM.

  9. #9
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi yokashi Xem bài viết
    bác ơi đoạn
    Code:
    float data = top->data;
    bị sai thì phải
    Sao lại sai?? Trình biên dịch báo lỗi gì à?
    Nếu có lỗi thì tôi nghĩ là do code của bác, có kiểm tra isEmpty() trước khi top_pop() không?
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  10. #10
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    Sao lại sai?? Trình biên dịch báo lỗi gì à?
    Nếu có lỗi thì tôi nghĩ là do code của bác, có kiểm tra isEmpty() trước khi top_pop() không?
    thank bác nhắc mới nhớ sry bác = =!

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

  1. Tìm phần tử trong danh sách liên kết
    Gửi bởi cuongitk32 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 17-10-2010, 10:00 AM
  2. Hoán vị phần tử trong danh sách liên kết.
    Gửi bởi IT_BK 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: 11-09-2010, 11:52 PM
  3. Không thể xoá được các phần tử của mảng trong danh sách liên kết!
    Gửi bởi duyanh_28 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 28-07-2010, 11:46 AM
  4. Bài tập C Xóa một phần tử trong danh sách liên kết
    Gửi bởi without_you trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 26-04-2010, 10:48 PM
  5. Lập trình C | Tìm phần tử trong danh sách liên kết đơn
    Gửi bởi 7261819 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 26-05-2009, 01:03 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