Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Lỗi dùng delete và new trong C++?

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

    Mặc định Lỗi dùng delete và new trong C++?

    Chào các bác. Em viết một chương trình quản lý danh sách số nguyên bằng danh sách liên kết đơn. Dùng lệnh new và delete để cấp phát và xóa phần tử. Làm xong rồi test lại em thấy hàm delete không hoạt động, có nghĩa là sau khi xóa danh sách vẫn còn nguyên. Đọc đi đọc lại chẳng bít sai chỗ nào. Mong các bác chỉ giáo. Chân thành cảm ơn

    ///////
    Code:
    #include <conio.h>
    #include <stdio.h>
    typedef struct soNguyen
    	{
    	int chuSo;
    	struct soNguyen *pNext;
    	}node;
    
    typedef struct Clist
    	{
    	 node *lHead;    //tro den phan tu dau tien
    	 node *lPos;     //tro den phan tu hien hanh
    	 int soPhanTu;
    	}Clist;
    
    int duyetDanhSach(Clist &list)
    {
     node *pNode=list.lHead;
      while(pNode!=NULL)
    	{
    
    	 printf(" %d ",pNode->chuSo);
    	 pNode=pNode->pNext;
    
    	}                  
     return 0;
    }
    int xoaDanhSach(Clist &list)
    {
    node *pNode=NULL;
    node *qNode=list.lHead;
    while(qNode!=NULL)
    	{
    	pNode=qNode;
    	qNode=qNode->pNext;
    	delete pNode;
    	list.soPhanTu--;
    	}
    return 0;
    }
    
    int main()
    {
    clrscr();
    int number;
    Clist list;
    khoiTao(list);
     printf("Input a serie of whole number until 0 ! ");
     do
    	{
    	scanf("%d",&number);
            themPhanTuMoi(list,number,list.lHead);
    	}while(number!=0);
     clrscr();
    duyetDanhSach(list);
    xoaDanhSach(list);
    duyetDanhSach(list);
    getch();
    return 0;
    }
    Chính là đoạn code màu đỏ đấy ạ
    Đưa code vào tag
    Đã được chỉnh sửa lần cuối bởi longcock : 02-05-2009 lúc 06:13 AM.

  2. #2
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Bạn có cấp phát động bộ nhớ bằng từ khóa 'new' đâu mà có thể dùng 'delete'.
    Khi bạn khai báo node
    Code:
    *pNode=NULL
    thì thực sự bạn chưa hề tạo ra vùng trong bộ nhớ mà pnode trỏ tới, nên không thể dùng delete để xóa vì nó không hề tồn tại.
    Đã được chỉnh sửa lần cuối bởi icttrack : 30-04-2009 lúc 11:26 AM.

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    12

    Chính xác!!!!!!!!!!!!!!!

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

    cám ơn mọi người. Nhưng vấn đề là có thêm một hàm cấp phát thì cũng như thế thôi.
    Code:
    int themPhanTuMoi(Clist &list,int n,node *p)
    {
     node *newnode = new node;
     newnode->chuSo=n;
     newnode->pNext=NULL;
     if(p==NULL) //chen vao dau danh sach
    	{
    	if (list.lHead==NULL) list.lHead=list.lPos=newnode;
    	else
    		{
    		newnode->pNext=list.lHead;
    		list.lHead=list.lPos=newnode;
    		}
    	}
    
     else              //chen vao sau p;
    	{
    	  newnode->pNext=p->pNext;
    	  p->pNext=list.lPos=newnode;
    
    	}
    
      return(++list.soPhanTu);
    
    }
    nếu không tin, các bạn chạy thử !!
    Đã được chỉnh sửa lần cuối bởi longcock : 02-05-2009 lúc 06:48 PM. Lý do: đã bỏ hàm kiemTraRong

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

    có mỗi một câu hỏi mà cả tuần rồi chỉ thấy có hai cao thủ lên tiếng.

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Lỗi dùng delete và new trong C++?

    Bạn đưa code lên mà ko chịu đưa hết, còn thiếu hàm kiemtrarong. Mấy lỗi sai này phải debug mới biết. Nếu bạn đưa thiếu hàm thì làm sao biên dịch để chạy được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

    oh xin lỗi, mình đã bỏ hàm đó rồi, chỉ kiểm tra con trỏ list.lHead có NULL không thôi

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình ko hiểu ý tưởng của bạn lắm, sửa tạm như vầy :

    C++ Code:
    1. #include <conio.h>
    2. #include <stdio.h>
    3.  
    4. typedef struct soNguyen
    5. {
    6.     int chuSo;
    7.     struct soNguyen *pNext;
    8. } node;
    9.  
    10. typedef struct Clist
    11. {
    12.     node *lHead;    //tro den phan tu dau tien
    13.     node *lPos;     //tro den phan tu hien hanh
    14.     int soPhanTu;
    15. } Clist;
    16.  
    17.  
    18. int duyetDanhSach(Clist &list)
    19. {
    20.     node *pNode=list.lHead;
    21.    
    22.     while(pNode!=NULL)
    23.     {
    24.         printf(" %d ",pNode->chuSo);
    25.         pNode=pNode->pNext;
    26.     }                  
    27.  
    28.     return 0;
    29. }
    30.  
    31. int xoaDanhSach(Clist &list)
    32. {
    33.     node *pNode=NULL;
    34.     node *qNode=list.lHead;
    35.    
    36.     while(qNode!=NULL)
    37.     {
    38.         pNode=qNode;
    39.         qNode=qNode->pNext;
    40.         delete pNode;
    41.         list.soPhanTu--;
    42.     }
    43.  
    44.     list.lHead = NULL;
    45.  
    46.     return 0;
    47. }
    48.  
    49. int themPhanTuMoi(Clist &list,int n)
    50. {
    51.     node *newnode = new node;
    52.     newnode->chuSo=n;
    53.     newnode->pNext=NULL;
    54.     if(list.lHead == NULL) //chen vao dau danh sach
    55.     {
    56.         newnode->pNext = list.lHead;
    57.         list.lHead = list.lPos = newnode;
    58.     }
    59.     else              //chen vao sau p;
    60.     {
    61.         node *p = list.lHead;
    62.  
    63.         while (p->pNext != NULL)
    64.             p = p->pNext;
    65.  
    66.         p->pNext = list.lPos = newnode;
    67.  
    68.     }
    69.  
    70.     return(++list.soPhanTu);
    71. }
    72.  
    73. int main()
    74. {
    75.     //clrscr();
    76.     int number;
    77.     Clist list;
    78.  
    79.     list.lHead = NULL;
    80.     list.lPos = NULL;
    81.     list.soPhanTu = 0;
    82.  
    83.     //khoiTao(list);
    84.  
    85.     printf("Input a serie of whole number until 0 ! ");
    86.     do
    87.     {
    88.         scanf("%d",&number);
    89.         themPhanTuMoi(list,number);
    90.     }
    91.     while(number!=0);
    92.    
    93.     //clrscr();
    94.     duyetDanhSach(list);
    95.     xoaDanhSach(list);
    96.     //duyetDanhSach(list);
    97.    
    98.     getch();
    99.     return 0;
    100. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    1

    vì pnode là dạng char* nên delete phải như thế này delete [] pnode.

  10. #10
    Ngày gia nhập
    10 2010
    Bài viết
    177

    Bạn có thể tham khảo cách tạo và xóa ở bài này.

    PHP Code:
    #include<stdio.h>
    #include<conio.h>

    struct NODE
    {
        
    int Key;
        
    NODE *Next;
    };
    NODE *CreateNode(int Data)
    {
        
    NODE *Node = new NODE;
        if(
    Node == NULL)
            return 
    NULL;
        
    Node->Key Data;
        
    Node->Next NULL;
        return 
    Node;
    }

    NODE *pTail(NODE *Head)
    {
        
    NODE *Tail, *Node;
        
    Tail NULL;
        
    Node Head;
        if(
    Node == NULL)
            
    Tail Node;
        else
        {
            while(
    Node != NULL)
            {
                
    Tail Node;
                
    Node Node->Next;
            }
        }
        return 
    Tail;
    }
    NODE *pPre(NODE *Head)
    {
        
    NODE *Tail,*Pre,*Node;
        
    Tail NULL;
        
    Pre NULL;
        
    Node Head;
        if(
    Node == NULL)
            
    Tail Node;
        else
        {
            while(
    Node != NULL)
            {
                
    Pre Tail;
                
    Tail Node;
                
    Node Node->Next;
            }
        }
        return 
    Pre;

    }
    int AddTail(NODE* &Headint Data)
    {
        
    NODE *Tail pTail(Head);
        
    NODE *NewNode CreateNode(Data);
        if(
    NewNode == NULL)
            return 
    0;

        
    Tail->Next NewNode;
        return 
    1;
    }
    int AddHead(NODE* &Headint Data)
    {
        
    NODE *Node CreateNode(Data);
        if(
    Node == NULL)
            return 
    0;
        if(
    Head == NULL)
            
    Head Node;
        else
        {
            
    Node->Next Head;
            
    Head Node;
        }
        return 
    1;
    }
    void PrintList (NODE *Head/*xuat cac phan tu trong danh sach*/
    {
        
    NODE *Node;
        
    Node Head;
        while (
    Node != NULL)
        {
            
    printf ("%5d\n"Node->Key);
            
    Node Node->Next;
        }
    }
    void DeleteHead(NODE *&Head)
    {
        
    NODE *Node;
        while(
    Head != NULL)
        {
            
    Node Head;
            
    Head Head->Next;
            
    delete Node;
            break;
        }

    }
    void DeleteTail(NODE *&Head)
    {
        
    NODE *Tail,*Pre;
        
    Tail pTail(Head);
        
    Pre pPre(Head);

        while(
    Head != NULL)
        {
            
    Pre->Next Tail->Next;
            
    delete Tail;
            break;
        }
    }

    void RemoveAll(NODE *&Head)
    {
        
    NODE *Node;
        while(
    Head != NULL)
        {
            
    Node Head;
            
    Head Head->Next;
            
    delete Node;
        }
        
    Head NULL;
    }
    int CountX(NODE *Headint x)
    {
        
    int dem 0;
        while(
    Head != NULL)
        {
            if(
    Head->Key == x)
                
    dem++;
            
    Head Head->Next;
        }
        return 
    dem;
    }
    int SumList(NODE *Head)
    {
        
    int s 0;
        
        while(
    Head != NULL)
        {
            
    Head->Key;
            
    Head Head->Next;
        }
        return 
    s;
    }
    int CountList(NODE *Head)
    {
        
    int dem 0;
        
        while(
    Head != NULL)
        {
            
    dem++;
            
    Head Head->Next;
        }
        return 
    dem;
    }
    int MaxList(NODE *Head)
    {
        
    int Max Head->Key;
        while(
    Head != NULL)
        {
            if(
    Max Head->Key)
                
    Max Head->Key;
            
    Head Head->Next;
        }
        return 
    Max;
    }
    NODE *SplitNode2a(NODE *&Headint x/*tach danh sach, khong can giu lai danh sach ban dau*/
    {
        
    NODE *NewNode1 NULL;
        
    NODE *NewNode2 NULL;
        
    int Temp;
        while (
    Head != NULL)
        {
            
    Temp Head->Key;
            if (
    Head->Key x)
            {
                
    AddHead (NewNode1Temp);
            }
            else
            {
                
    AddHead (NewNode2Temp);
            }
            
    Head Head->Next;
        }
        
    printf("danh sach cac phan tu > %d:\n "x);
        
    PrintList(NewNode1);
        
    printf ("\n\n");
        return 
    NewNode2;
    }
    NODE *SplitNode2b(NODE *&Headint x)  /* tach danh sach, can giu lai danh sach ban dau*/
    {
        
    NODE *NewNode1 NULL;
        
    NODE *NewNode2 NULL;
        
    int Temp;
        
    NODE *Node Head;
        while(
    Node != NULL)
        {
            
    Temp Node->Key;
            if(
    Node->Key x)
            {
                
    AddHead(NewNode1Temp);
            }
            else
            {
                
    AddHead(NewNode2Temp);
            }
            
    Node Node->Next;
        }
        
    printf("danh sach phan tu > %d:\n ",x);
        
    PrintList(NewNode1);
        
    printf("\n\n");
        return 
    NewNode2;
    }

    void main()
    {
        
    NODE *Root;
        
    Root NULL;
        
    int Data;
        do
        {
            
    printf("nhap du lieu, -1 xuat ra: ");
            
    scanf("%d",&Data);
            if(
    Data == -1)
                break;
            
    AddHead(Root,Data);
        }
        while(
    Data != -1);
        
    printf("\n\n");

        
        
    printf("Tong cac phan tu trong danh sach la: %d\n",SumList(Root));
        
    printf("\n\n");

        
    printf("MaxList cua danh sach la: %d\n",MaxList(Root));
        
    printf("\n\n");

        
    printf("So luong phan tu trong danh sach: %d\n",CountList(Root));
        
    printf("\n\n");

        
    printf("du lieu sau khi nhap: ");
        
    PrintList(Root);
        
    printf("\n\n");

        do
        {
            
    printf("du lieu them vao: ");
            
    scanf("%d",&Data);
            if(
    Data == -1)
                break;
            
    AddTail(Root,Data);
        }
        while(
    Data != -1);
        
    printf("\n\n");

        

        
    printf("du lieu sau khi them vao cuoi la :\n ");
        
    PrintList(Root);
        
    printf("\n\n");

        
    DeleteHead(Root);

        
    printf("du lieu sau khi xoa phan tu dau: \n");
        
    PrintList(Root);
        
    printf("\n\n");

        
    DeleteTail(Root);

        
    printf("du lieu sau khi xoa phan tu dau: \n");
        
    PrintList(Root);
        
    printf("\n\n");

        
    int x ;
        
    printf("nhap x: ");
        
    scanf("%d",&x);
        
    printf("\n\n");
        
    printf("so luong phan tu trung voi x = %d la: %d\n",x,CountX(Root,x));
        
    printf("\n\n");

        if (
    Root != NULL)
        {
            
    printf ("nhap x: ");
            
    scanf ("%d", &x);
        }
        
    printf ("\n\n\n");

        
    printf("TH DANH SACH BAN DAU TON TAI\n");
        
    NODE *NewNode3 SplitNode2b(Root,x);
        
    printf("danh sach cac phan tu <= %d: \n"x);
        
    PrintList(NewNode3);
        
    printf("\n\n");

        
    printf("TH DANH SACH BAN DAU KO TON TAI\n");
        
    NODE *NewNode2 SplitNode2a(Rootx);
        
    printf("danh sach cac phan tu <= %d: \n"x);
        
    PrintList(NewNode2);
        
    printf("\n\n");

        
    RemoveAll(Root);



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

  1. Cấp phát động trong lớp Vector, sử dụng ko dùng được "delete ToaDo;" thì kết quả không đúng?
    Gửi bởi PigPaPoo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 31-10-2011, 09:50 PM
  2. Lập trình C++ tại sao khi dùng delete pC_String rồi mà vẫn sử dụng nó được
    Gửi bởi meterpreter trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 08-10-2011, 05:07 PM
  3. Cách dùng hàm delete trong C++ như thế nào?
    Gửi bởi voluong0thaicuc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 15-11-2010, 08:55 PM
  4. Lập trình C++ hướng dẫn cấp phát động cho mảng 3 chiều, dùng toán tử new, delete
    Gửi bởi trungthuan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 03-07-2010, 02:37 PM
  5. [C++]Không thể dùng lệnh delete
    Gửi bởi trieuanhl trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-11-2006, 06:51 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