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