題目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;
}