Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 18
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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:

    Mã:
    typedef struct _Node{    int     data;    _Node   *next;}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.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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à [IMG]images/smilies/21.gif[/IMG]
    code chưa hoàn chỉnh có nhiu mình up nhiu thôi
    Mã:
    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 tham gia
    Sep 2015
    Bài viết
    0
    có ai giúp mình ko [IMG]images/smilies/Cry.gif[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình giả sử code bạn đúng hết [IMG]images/smilies/biggrin.png[/IMG] , thêm pop_top nữa là xong

    Mã:
    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 tham gia
    Sep 2015
    Bài viết
    0
    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ù. :-|

    Mã:
    typedef struct _Node {    float           data;    struct _Node    *next;}Node, *PNode;//cấp pháp bộ nhớ 1 nodePNode newNode(){    return (PNode)malloc(sizeof(Node));}// giải phóng 1 nodevoid deleteNode (PNode lpNode){    free(lpNode);}// kiểm tra danh sách int isEmpty(PNode list){    return (list == NULL);}// thêm  phần tử vào đầu danh sáchvoid push_top(PNode *list, float data){    PNode node = newNode();    node->data = data;    node->next = *list;     *list = node;}// thêm phần tử vào cuối danh sáchvoid push_bottom(PNode *list, float data){    if(list)    {        PNode last = NULL;        for(last = *list; last->next != NULL; last = last->next);         last->next = newNode();        last->next->data = data;    }    else    {        *list = newNode();        (*list)->data = data;    }}float pop_top(PNode *list){    PNode top = *list;    float data = top->data;     *list = top->next;     deleteNode(top);    return data;}// toán tửint isOperator(char c){    return ( (c=='+') || (c == '-') || (c=='*') || (c=='/') || (c=='^'));}//thêm ký tựchar *ThemKyTu (char *p, char c){        int DoDai;        DoDai = strlen(p);        p[DoDai]=c;        p[DoDai + 1]='\0';        return p;} float tinhHT (char *p){    PNode list = NULL;     int dodai;    float so , so1 , so2 , tong;    int i ;    char Tam[256];    dodai = strlen(p);    Tam[0] = '\0';    for (int i = 0 ; i < dodai; ++i)    {        if(p[i] == ' ')        {            if(Tam[0] != '\0')            {                so = atoi(Tam);                push_top(&list , so);                Tam[0] = '\0';            }        }        else        {            if(isOperator(p[i]))            {                if(Tam[0] != '\0')                {                    so = atoi(Tam);                    push_top(&list, so);                    Tam[0] = '\0';                }                so2 = pop_top(&list);                so1 = pop_top(&list);                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(&list , tong);            }            else                ThemKyTu(Tam , p[i]);        }    }    tong = pop_top(&list);    printf("Ket qua:");    printf("&.2f",tong);    return tong;}

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 tham gia
    Sep 2015
    Bài viết
    0
    bác ơi đoạn
    Mã:
    float data = top->data;
    bị sai thì phải [IMG]images/smilies/offline.gif[/IMG]
    hay do mình chưa tạo cái deletenode ?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi yokashi
    bác ơi đoạn
    Mã:
    float data = top->data;
    bị sai thì phải [IMG]images/smilies/offline.gif[/IMG]
    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?

  10. #10
    Trích dẫn Gửi bởi doicanhden
    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 = =!

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •