本文是我的个人总结,如有不当之处还请大家批评指正。
构造
头插
1.使用first及辅助指针s
2.s存储数据,first对s挂链
尾插
1.使用两个指针 建立尾指针r(初始值指向first),辅助指针s(初始值置空)
2.s存储数据
3.r挂链(r下一节点指向s,r指向s)
遍历
1.建立工作指针p (初始值指向第一结点)
2.p非空时输出
查找
按值查找,返回元素所在的位置
一)需要工作指针p(初始值为第一结点),计数器,标记变量
二)查找过程通过while循环实现(p非空):
1.计数器递增
2.if判断,若找到,记录下标
3.返回查找元素的下标
int LinkList::located(int x){
Node *p=first->next;
if(!p) throw"无法查找!";
int cnt=0;
int flag=0;
while(p){
if(p->data==x) flag=cnt;
cnt++;
p=p->next;
}
return flag;
}
按位置查找,返回目标位置数据
一)需要工作指针p
二)通过while循环实现(p非空):
1.p依次前进,计数器递增
2.如果找到,返回目标位置的数据;若找不到,输出错误信息
int LinkList::get(int i){
Node *p=first->next;
int f=0;
while(p && f<i){
p=p->next;
f++;
}
if(!p) throw"无法查找!";
else return p->data;
}
删除
操作必备:
1.需要辅助指针q,暂存要删除的结点
2.需要工作指针p,初始值指向第一结点
按位置删除
思路:while循环实现(条件:循环变量小于目标下标且工作指针p非空)
1.工作指针p需要移动到要删除元素的前一个位置
2.q暂存要删除的元素
3.p下指针与目标元素脱链,指向删除元素的下一位置
4.删除q
int Linklist::delete_i(int i)
{
Node *p,*q;int j=0;
p=first->next;
while(j<i && p)
{
if(j==i-1) //工作指针在i-1处
{
q=p->next; //暂存要删除的元素
p->next=q->next; //挂链
delete q;
return 1; //删除成功返回1
}
j++;
}
return 0; //删除失败返回0
}
按值删除
思路:对目标元素进行查找(得到目标元素位置),之后调用按位置删除函数。
int Linklist::delete_x(int x)
{
int i=located(x);
if(delete_i(i)) return 1;
else return 0;
}
例:输入一组数据,实现头插、尾插,并对尾插的数据进行按位置、按数值删除操作
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
class Linklist
{
public:
Linklist();
Linklist(int a[],int n);
void print();
int delete_x(int x);
int delete_i(int i);
int located(int x);
~Linklist();
private:
Node *first;
};
Linklist::Linklist() //头插
{
int x=0;
first=new Node;first->next=NULL;
Node *s;
while(cin>>x)
{
if(x==0) break;
s=new Node;
s->data=x;
s->next=first->next;
first->next=s;
}
}
Linklist::Linklist(int a[],int n) //尾插
{
first=new Node;first->next=NULL;
Node*s,*r;
r=first;
for(int i=1;i<=n;i++)
{
s=new Node;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void Linklist::print()
{
Node* p;
p=first->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int Linklist::located(int x){
Node *p=first->next;
if(!p) throw"无法查找!";
int cnt=0;
int flag=0;
while(p){
if(p->data==x) flag=cnt;
cnt++;
p=p->next;
}
return flag;
}
int Linklist::delete_x(int x)
{
int i=located(x);
if(delete_i(i)) return 1;
else return 0;
}
int Linklist::delete_i(int i)
{
Node *p,*q;int j=0;
p=first->next;
while(j<i && p)
{
if(j==i-1) //工作指针在i-1处
{
q=p->next; //暂存要删除的元素
p->next=q->next; //挂链
delete q;
return 1;
}
j++;
}
return 0;
}
Linklist::~Linklist()
{
Node *p;
while(first)
{
p=first->next;
delete first;
first=p;
}
}
int main()
{
int a[10000],num=0,x;
while(cin>>x) //连续输入数据,0为结束的标志
{
if(x==0) break;
a[++num]=x;
}
Linklist wei(a,num);
wei.print();
int t1;
cin>>t1;
if(wei.delete_x(t1))
{
wei.print();
}
else
{
cout<<"Error\n";
}
cin>>t2;
if(wei.delete_i(t2))
{
wei.print();
}
else
{
cout<<"Error\n";
}
return 0;
}