[回顧性練習1]C++實現鏈表中刪除數據元素(指針)

題目1:C++實現鏈表中刪除數據元素

實現鏈表的輸入(已實現)、輸出和刪除成員函數。

輸入時,根據endtag確定是否結束輸入;
刪除時,根據下標(從0開始)。

注意,輸入的順序跟存放的順序以及輸出的順序是相反的。

 

 

  測試輸入 期待的輸出
測試用例1 1 2 3 4 5 0
2
5 4 3 2 1
5 4 2 1
測試用例2 1 2 3 4 0
0
4 3 2 1
3 2 1

代碼:

//前置代碼
#include "stdlib.h"
#include "iostream"
using namespace std ;

class List; //前視定義,否則友元無法定義
class LinkNode
{
 friend  List; //鏈表結點類的定義
 private:
   LinkNode *link;
   int data;
 public:
   LinkNode(const int & item, LinkNode *ptr = NULL){  data=item;link=ptr;}
   LinkNode (LinkNode *ptr = NULL)    {link=ptr;}
   ~LinkNode(){};

};

class List
{//單鏈表類的定義
private:
    LinkNode *first; //指向首結點的指針
public:
    List () { first = new LinkNode ();}   // 帶頭結點
    ~List (){MakeEmpty();}         //析構函數
    void MakeEmpty ( );      //鏈表置空
    int Remove ( int i );
    void input(int  endTag);
    void output();
};
void List:: MakeEmpty ( )
 {
    LinkNode *q;
    while (  first->link != NULL )
	{q = first->link;
     first->link = q->link;
     delete q;
    }
};

void List :: input (int endTag){
	LinkNode  *newnode; int val;
	cin>>val;
	while(val!=endTag)
	{
		newnode=new LinkNode (val);
  	        newnode->link=first->link;
		first->link=newnode;
		cin>>val;
	}
}
//答題區域
int List :: Remove ( int i )
{
    if(i!=0)
    {
        LinkNode *p=first->link,*pr ;
        for(;i>0;i--)
        {
            pr=p;
            p=p->link;
        }
        pr->link=p->link;
    }
    else
        first=first->link;
    return 0;
}
void List :: output()
{
    LinkNode *p=first->link;
    while(p)
    {
        if(p->link!=NULL)
        {
            cout<<p->data<<" ";
        }
        else
             cout<<p->data;
             p=p->link;
    }
    cout<<endl;
}
//後置代碼
int main()
{
    List l;
    l.input(0); //0爲輸入的結束數字
    l.output (); 
    int index;
    cin>>index; //要刪除的元素的下標,下標從0 開始
    l.Remove(index);  
    l.output (); //刪除後輸出
    return 0;
}

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章