Announcement

Collapse
No announcement yet.

Hỏi về tạo lớp liên kết trong OOP

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Hỏi về tạo lớp liên kết trong OOP

    Đề: Định nghĩa lớp List biểu diễn khái niệm danh sách liên kết đơn các số nguyên với phương thức thiết lập và huỷ bỏ và các hàm thành phần xuất, nhập, thêm đầu, thêm cuối.

    Mình viết được code thế này
    Code:
    #include "iostream"
    #include "conio.h"
    
    using namespace std;
    
    typedef struct tagnode
    {
    	int data;
    	struct tagnode* pnext;
    }node;
    
    class List
    {
    	node *phead;
    	node *ptail;
    public:
    	List();
    	List(List &a)
    	{
    		a.phead = NULL;
    		a.ptail = NULL;
    	}
    	~List();
    	void themdau(List &a, node*p);
    	void themcuoi(List &a, node*p);
    	void nhap(List &a, node*p);
    	void xuat(List &a, node*p);
    };
    
    node* khoitaonode(int x)
    {
    	 node*p = new node;
    	if (p == NULL)
    	{
    		cout << "khong cap phat duoc";
    		exit(0);
    	}
    	else
    	{
    		p->data = x;
    		p->pnext = NULL;
    	}
    	return p;
    }
    
    void List::themdau(List &a, node*p)
    {
    	if (a.phead == NULL)
    	{
    		a.phead = a.ptail = NULL;
    	}
    	else
    	{
    		p->pnext = a.phead;
    		a.phead = p;
    	}
    }
    
    void List::themcuoi(List &a, node*p)
    {
    	if (a.phead == NULL)
    	{
    		a.phead = a.ptail = NULL;
    	}
    	else
    	{
    		a.ptail->pnext = p;
    		a.ptail = p;
    	}
    }
    
    void List::nhap(List &a, node*p)
    {
    	int x, n;
    	a.phead = a.ptail = NULL;
    	cout << "Nhap vao so phan tu: ";
    	cin >> n;
    	for (int i = 1; i < n + 1; i++)
    	{
    		cout << "Nhap vao phan tu " << i << ":";
    		cin >> x;
    		p = khoitaonode(x);
    		themcuoi(a, p);
    	}
    }
    
    void List::xuat(List &a, node*p)
    {
    	for (p = a.phead; p != NULL; p = p->pnext)
    	{
    		cout << p->data << "  ";
    	}
    }
    
    void main()
    {
    	List l, a;
    	node *p;
    	l.nhap(a, p);
    	l.xuat(a, p);
    }
    các anh chị giúp em cái code bị lỗi gì mà no ko chạy dc.
    :stick::stick:

  • #2
    em tạo struct bên ngoài lớp thế có đúng ko,
    :stick::stick:

    Comment


    • #3
      Bạn có thể cho xin cái lỗi của nó được không?

      Comment


      • #4
        Lỗi đây anh
        Code:
        Error	1	error C4700: uninitialized local variable 'p' used
        :stick::stick:

        Comment


        • #5
          Originally posted by 12520816 View Post
          Lỗi đây anh
          Code:
          Error	1	error C4700: uninitialized local variable 'p' used
          Bạn chưa khởi tạo p đó Đại.

          Comment


          • #6
            Originally posted by 12520554 View Post
            Bạn chưa khởi tạo p đó Đại.
            thấy nó báo là biến p đã được sử dụng
            :stick::stick:

            Comment


            • #7
              Originally posted by 08520021 View Post
              Bạn có thể cho xin cái lỗi của nó được không?
              Originally posted by 12520816 View Post
              Lỗi đây anh
              Code:
              Error	1	error C4700: uninitialized local variable 'p' used
              Lần sau em nên đọc kỹ nội quy trước khi post để mọi người khong phải mất công hỏi ngược lại như thế này. Vì em không tuân thủ nội quy nên giờ tôi phải mất công hỏi thêm là LỖI Ở HÀNG SỐ MẤY TRONG CODE VẬY HẢ EM ?????

              Comment


              • #8
                Chắc là vấn đề của bạn tương tự cái này.
                Lần sau bạn làm như anh An nói nha, thêm vào một chút thông tin: lỗi biên dịch/runtime?, trình biên dịch nữa thì tốt, thông báo lỗi và line số mấy?

                Code:
                void abc(int *x) {
                	int *a = new int;
                	*a = 100;
                	x = a;
                	cout << *x << endl;
                }
                
                int main()
                {	
                	int* x;
                	abc(x);
                	cout << *x << endl;
                }

                Comment


                • #9
                  Originally posted by 12520816 View Post
                  Đề: Định nghĩa lớp List biểu diễn khái niệm danh sách liên kết đơn các số nguyên với phương thức thiết lập và huỷ bỏ và các hàm thành phần xuất, nhập, thêm đầu, thêm cuối.

                  Mình viết được code thế này
                  Code:
                  #include "iostream"
                  #include "conio.h"
                  
                  using namespace std;
                  
                  typedef struct tagnode
                  {
                  	int data;
                  	struct tagnode* pnext;
                  }node;
                  
                  class List
                  {
                  	node *phead;
                  	node *ptail;
                  public:
                  	List();
                  	List(List &a)
                  	{
                  		a.phead = NULL;
                  		a.ptail = NULL;
                  	}
                  	~List();
                  	void themdau(List &a, node*p);
                  	void themcuoi(List &a, node*p);
                  	void nhap(List &a, node*p);
                  	void xuat(List &a, node*p);
                  };
                  
                  node* khoitaonode(int x)
                  {
                  	 node*p = new node;
                  	if (p == NULL)
                  	{
                  		cout << "khong cap phat duoc";
                  		exit(0);
                  	}
                  	else
                  	{
                  		p->data = x;
                  		p->pnext = NULL;
                  	}
                  	return p;
                  }
                  
                  void List::themdau(List &a, node*p)
                  {
                  	if (a.phead == NULL)
                  	{
                  		a.phead = a.ptail = NULL;
                  	}
                  	else
                  	{
                  		p->pnext = a.phead;
                  		a.phead = p;
                  	}
                  }
                  
                  void List::themcuoi(List &a, node*p)
                  {
                  	if (a.phead == NULL)
                  	{
                  		a.phead = a.ptail = NULL;
                  	}
                  	else
                  	{
                  		a.ptail->pnext = p;
                  		a.ptail = p;
                  	}
                  }
                  
                  void List::nhap(List &a, node*p)
                  {
                  	int x, n;
                  	a.phead = a.ptail = NULL;
                  	cout << "Nhap vao so phan tu: ";
                  	cin >> n;
                  	for (int i = 1; i < n + 1; i++)
                  	{
                  		cout << "Nhap vao phan tu " << i << ":";
                  		cin >> x;
                  		p = khoitaonode(x);
                  		themcuoi(a, p);
                  	}
                  }
                  
                  void List::xuat(List &a, node*p)
                  {
                  	for (p = a.phead; p != NULL; p = p->pnext)
                  	{
                  		cout << p->data << "  ";
                  	}
                  }
                  
                  void main()
                  {
                  	List l, a;
                  	node *p;
                  	l.nhap(a, p);
                  	l.xuat(a, p);
                  }
                  các anh chị giúp em cái code bị lỗi gì mà no ko chạy dc.
                  Nếu bạn đã code bằng phương pháp LTHĐT thì không nên dùng struct vì vi phạm tính đóng gói.
                  Mình xin gợi ý cho bạn về lớp LIST như sau:
                  - Lớp LIST trong OOP cũng giống LIST trong struct thôi. Thế nên bạn phải khai báo một lớp NODE và dùng lớp LIST để biểu diễn lớp NODE.
                  Nếu NODE của bạn là số nguyên thì bạn có thể khai báo như sau: ( đây là khai báo trong file NODE.h bạn tự định nghĩa hàm trong file NODE.cpp của class NODE nhá)
                  Code:
                  class NODE
                  {
                  	int info;
                  	NODE *Next;
                  public:
                  	NODE(void);
                  	void set_info(int );//set giá trị cho info
                  	int get_info();//trả về giá trị info
                  	NODE *get_node();//tra ve NODE *Next
                  	void set_node(NODE *);//gán *Next cho 1 NODE khác
                  };
                  Đến khai báo lớp LIST thì bạn có các hàm sau:
                  Code:
                  #include"NODE.h"
                  #include<conio.h>
                  #include<iostream>
                  
                  using namespace std;
                  
                  class LIST
                  {
                  private:
                  	int n;
                  	NODE *Head;
                  	NODE *Tail;
                  public:
                  	LIST(void);
                  	~LIST();
                  	void addhead(NODE *p);
                  	void addtail(NODE *p);
                  	int is_empty();//kiem tra LIST rỗng hay k
                  	void nhap();
                  	void display();
                  	void remove_first();
                  	NODE *taonode(int);
                  };
                  Các hàm của class LIST không nên dùng phương thức bạn để lấy dữ liệu từ class NODE mà nên tận dụng các phương thức set/get trong class NODE để thao tác.
                  Mình chỉ gợi ý vậy thôi. Bạn tự định nghĩa hàm nhá.
                  Chúc bạn thành công !

                  Comment


                  • #10
                    Originally posted by 12520332 View Post
                    Nếu bạn đã code bằng phương pháp LTHĐT thì không nên dùng struct vì vi phạm tính đóng gói.
                    Mình xin gợi ý cho bạn về lớp LIST như sau:
                    - Lớp LIST trong OOP cũng giống LIST trong struct thôi. Thế nên bạn phải khai báo một lớp NODE và dùng lớp LIST để biểu diễn lớp NODE.
                    Nếu NODE của bạn là số nguyên thì bạn có thể khai báo như sau: ( đây là khai báo trong file NODE.h bạn tự định nghĩa hàm trong file NODE.cpp của class NODE nhá)
                    Code:
                    class NODE
                    {
                    	int info;
                    	NODE *Next;
                    public:
                    	NODE(void);
                    	void set_info(int );//set giá trị cho info
                    	int get_info();//trả về giá trị info
                    	NODE *get_node();//tra ve NODE *Next
                    	void set_node(NODE *);//gán *Next cho 1 NODE khác
                    };
                    Đến khai báo lớp LIST thì bạn có các hàm sau:
                    Code:
                    #include"NODE.h"
                    #include<conio.h>
                    #include<iostream>
                    
                    using namespace std;
                    
                    class LIST
                    {
                    private:
                    	int n;
                    	NODE *Head;
                    	NODE *Tail;
                    public:
                    	LIST(void);
                    	~LIST();
                    	void addhead(NODE *p);
                    	void addtail(NODE *p);
                    	int is_empty();//kiem tra LIST rỗng hay k
                    	void nhap();
                    	void display();
                    	void remove_first();
                    	NODE *taonode(int);
                    };
                    Các hàm của class LIST không nên dùng phương thức bạn để lấy dữ liệu từ class NODE mà nên tận dụng các phương thức set/get trong class NODE để thao tác.
                    Mình chỉ gợi ý vậy thôi. Bạn tự định nghĩa hàm nhá.
                    Chúc bạn thành công !
                    Thanks bạn nhiều, đã sữa dc lỗi :happy:
                    :stick::stick:

                    Comment


                    • #11
                      Originally posted by 12520332 View Post
                      Nếu bạn đã code bằng phương pháp LTHĐT thì không nên dùng struct vì vi phạm tính đóng gói.
                      Mình xin gợi ý cho bạn về lớp LIST như sau:
                      - Lớp LIST trong OOP cũng giống LIST trong struct thôi. Thế nên bạn phải khai báo một lớp NODE và dùng lớp LIST để biểu diễn lớp NODE.
                      Nếu NODE của bạn là số nguyên thì bạn có thể khai báo như sau: ( đây là khai báo trong file NODE.h bạn tự định nghĩa hàm trong file NODE.cpp của class NODE nhá)
                      Code:
                      class NODE
                      {
                      	int info;
                      	NODE *Next;
                      public:
                      	NODE(void);
                      	void set_info(int );//set giá trị cho info
                      	int get_info();//trả về giá trị info
                      	NODE *get_node();//tra ve NODE *Next
                      	void set_node(NODE *);//gán *Next cho 1 NODE khác
                      };
                      Đến khai báo lớp LIST thì bạn có các hàm sau:
                      Code:
                      #include"NODE.h"
                      #include<conio.h>
                      #include<iostream>
                      
                      using namespace std;
                      
                      class LIST
                      {
                      private:
                      	int n;
                      	NODE *Head;
                      	NODE *Tail;
                      public:
                      	LIST(void);
                      	~LIST();
                      	void addhead(NODE *p);
                      	void addtail(NODE *p);
                      	int is_empty();//kiem tra LIST rỗng hay k
                      	void nhap();
                      	void display();
                      	void remove_first();
                      	NODE *taonode(int);
                      };
                      Các hàm của class LIST không nên dùng phương thức bạn để lấy dữ liệu từ class NODE mà nên tận dụng các phương thức set/get trong class NODE để thao tác.
                      Mình chỉ gợi ý vậy thôi. Bạn tự định nghĩa hàm nhá.
                      Chúc bạn thành công !

                      Mình không hiểu int n trong List để làm gì vậy bạn ?

                      Comment


                      • #12
                        Originally posted by 16520126 View Post
                        Mình không hiểu int n trong List để làm gì vậy bạn ?
                        "Bạn" đó viết bài này 4 năm về trước giờ bạn đó tốt nghiệp đi du học mất rồi em, đào mộ gì sâu dữ.

                        Comment


                        • #13
                          Originally posted by 16520126 View Post
                          Mình không hiểu int n trong List để làm gì vậy bạn ?
                          n chỉ là thành phần dữ liệu của lớp LIST thôi, bình thường mà.

                          Comment

                          LHQC

                          Collapse
                          Working...
                          X