鱼C论坛

 找回密码
 立即注册
查看: 3748|回复: 3

单链表的清除

[复制链接]
发表于 2022-4-18 23:00:44 | 显示全部楼层 |阅读模式
15鱼币
        /*while(head->next!=NULL){
                                        p1=head->next;
                                        head=head->next;
                                        delete p1;
                                }*/
                                Node<T>*p1=head->next;
                                while(p1!=NULL){
                                        Node<T>*p2=p1;
                                        p1=p1->next;
                                        
                                        delete p2;}
如上面的代码所示,其中:
head是指向头结点的指针, 为什么下面那个代码进行清除之后,用显示操作还会显示出来,而上面的代码却可以显示空表? ?
#include <iostream>
using namespace std;


//Node 
template <class T>
class Node{
        public:
                T data;
                Node<T> *next;
};

//linkedList 
template <class T>
class linkedList{
        private:
                Node<T> *head, *tail;
                
                Node<T> *getPos(int p){   //get the position of the number p node 
                        if(p==0) return head;
                        int i=1;
                        Node<T> *tmp= head->next ;
                        while(i<p && tmp!=NULL){
                                i++;
                                tmp= tmp->next;
                        }
                        return tmp;
                }
        public:
                linkedList(){
                        head = tail = new Node<T>;
                        head -> next = NULL;
                }
                
                ~linkedList(){
                        Node<T> *tmp;
                        while(head!=NULL){
                                tmp= head;
                                head = head -> next;
                                delete tmp;
                        }
                }
                
                
                //functions
                //1.append
                bool append(T value){
                        Node<T>* p1= new Node<T>;
                        p1->data = value;
                        p1->next = NULL;
                        tail ->next = p1;
                        tail = p1;
                        return true;
                }
                
                //2.length
                int length(){
                        int i=0;
                        Node<T>* p= head->next ;
                        if(p==NULL) {
                        cout<<"empty list!"<<endl;
                        return 0;}
                        else{
                                while(p!=NULL){
                                        i++;
                                        p=p->next;
                                }
                        }
                        return i;
                }
                
                //3.display
                bool display(){
                        Node<T>* p=head->next;
                        if(p==NULL)cout <<"empty list"<<endl;
                        while(p!=NULL){
                                cout <<p->data<< ' ';
                                p= p->next;
                        }
                        cout <<endl;
                        return true;
                }
                
                //4.insert 
                bool insert(int p,T value ){
                        if(p<0 || p>length()) {
                                cout<<"illegal insert!"<<endl;
                                return false;}
                        Node<T>* a= new Node<T>;
                        a->data= value;
                        Node<T> *b,*c;
                        b=getPos(p-1);
                        c=getPos(p);
                        b->next = a;
                        a->next = c;
                        return true;
                }
                
                //5.clear
                bool clear(){
                        Node<T>* p1= head->next;
                        if(p1==NULL){
                                cout<<"already empty!\n"<<endl;
                        }
                        else {
                                
                                /*while(head->next!=NULL){
                                        p1=head->next;
                                        head=head->next;
                                        delete p1;
                                }*/
                                while(p1!=NULL){
                                        Node<T>*p2=p1;
                                        p1=p1->next;
                                        
                                        delete p2;}
                                cout<<"clear success!\n"<<endl;
                        }
                        return true;
                } 
                //6.
};
int main(){
        linkedList <int> LL;
        int choice,p,value;
        bool ok;
        do{
                cout<<"单链表程序(0.sign out,1.append,2.length,3.display,4.insert,5.clear,6删除,7查找,8修改,9定位),请选择:"<<endl;
                cin>>choice;
                switch(choice){
                        case 0:
                                cout<< "sign out !"<<endl;
                                break;
                        case 1:
                                cout<<"please input the value:";
                                cin>>value;
                                ok=LL.append(value);
                                if(ok==false) cout<<"append error!"<<endl;
                                else cout<<"append success!"<<endl;
                                break;
                        case 2:
                                p=LL.length();
                                cout<<"the length is:"<<p<<endl;
                                break;
                        case 3:
                                LL.display();
                                break;
                        case 4:
                                cout<<"please input the position:";
                                cin>>p;
                                cout<<"please input the value:";
                                cin>>value;
                                ok=LL.insert(p,value);
                                if(ok==true)cout << "insert success!\n";
                                else cout<<"insert error!\n";
                                break;
                        case 5:
                                LL.clear();
                                break;
                }
        }while(choice!=0);
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 08:29:24 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-19 08:31 编辑

第一个是错误的
      
                               while(head!=NULL){/////////
                                        p1=head;///////////
                                        head=head->next;
                                        delete p1;
                                }

如果需要保留head可以这么写
                                Node<T>*p1=head->next;
                                head->next=NULL;//////////////
                                while(p1!=NULL){
                                        Node<T>*p2=p1;
                                        p1=p1->next;
                                        
                                        delete p2;}
                                
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 12:36:39 | 显示全部楼层
jhq999 发表于 2022-4-19 08:29
第一个是错误的
        

请问错在哪了,完整代码的析构函数也是这样子来写的哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 15:42:21 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-19 15:47 编辑
waixiong 发表于 2022-4-19 12:36
请问错在哪了,完整代码的析构函数也是这样子来写的哦

while(head->next!=NULL){
        p1=head->next;
        head=head->next;
        delete p1;///////////////////////////此时p1=head,释放p1也就是把现在的head释放了
                  }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表