浅谈C++单链表的基本操作

本文是我的个人总结,如有不当之处还请大家批评指正。

构造

头插

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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值