反向輸出一個鏈表(鏈表逆置)

/*
This file was made for Link_list Exp on Linux

Main.cpp 

Founded in others' Blog ,Thanks for sharing your knowledge

*/


#include <iostream>
using namespace std;

class node
{
      public:
      node * next;
      int data;
};

node *test = NULL;

node *nodereverse(node *head)
{
    //如果一個函數的輸入參數有指針,一定要記住判斷指針時候爲空
    //1>:在使用一個指針之前一定要判斷它是否爲空;
    //2>:使用完後要釋放由指針指向的存儲單元
    //3>:釋放完存儲單元后要將指針賦值爲NULL;
     if(head->next==NULL || head==NULL)
          return head;


     node* temp1=head;
     node* temp2=NULL;
     node* temp3=head->next;
     temp1->next = NULL;
     //要注意這裏面的順序,先將temp3保存在temp2中,
     //然後再將temp3移動到下一個元素,然後才能改動temp2
     //
     while(temp3->next!=NULL)
     {
        temp2 = temp3;
        temp3 = temp3->next;
        temp2->next = temp1;//不能再temp3= temp3->next;之前執行
        temp1 = temp2;

     }
     temp3->next = temp2;
     return temp3;
}
void initnode()
{
     node * tmp = NULL;
     for(int i=0; i<4; i++)
     {
         tmp = new node;
         tmp->data = i;
         tmp->next = test;
         test = tmp;
     }
}
void display(node *nn)
{
if(nn==NULL)
{
    cout << "no data to display\n";
    return ;
}
node *dis = nn;
 while(dis!=NULL)
 {
        cout << dis->data << endl;
        dis = dis->next;
 }
}

//釋放動態申請的空間
void distroy(node *nn)
{
    if (nn==NULL)
    {
        return ;
    }
    while (nn!=NULL)
    {
        node *tmp = nn;
        nn = nn->next;
        delete tmp;
    }
}



int main()
{
    initnode();
    display(test);
    cout << "**************" << endl;
    node *tmp = nodereverse(test);
    if(test==NULL)
;
      //  exit(0);
    display(tmp);
    //tmp和test指向的存儲空間已經使用完畢,應該釋放掉他們申請的空間!
    //並且,要將他們賦值爲NULL,否則他們將成爲野指針!!!!,一定要注意了~~
    distroy(tmp);//釋放動態申請的內存
    tmp = NULL;//將他們重新賦值爲NULL,不然就會成爲野指針~~~~~
    test = NULL;
    cout << "tmp= " << tmp << endl;

    //如果上面沒有tmp = NULL;test = NULL;,display將會出錯,
    //因爲在display開始的時候判斷傳入的參數是否爲NULL,如果不把野指針賦值爲NULL,
    //那麼判斷就沒有效果,會繼續指向display中的while語句,而此時指針所指向的存儲空間已經被釋放掉了,
    //這樣就會出現異常.
    display(test);
    //system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章