c++实现顺序表和链表的基本操作

定义:

线性表是由 n ( n ≥ 0 ) \bm n(n\ge 0) n(n0)个相同类型的数据元素组成的有限序列。如:
L   ( a 1 , a 2 , a 3 , . . . a i − 1 , a i , a i + 1 , . . a n ) L\ (a_1,a_2,a_3,...a_{i-1},a_i,a_{i+1},..a_n) L (a1,a2,a3,...ai1,ai,ai+1,..an)

基本操作:

Init()Insert()Locate()Retrieve()Delete()Previous()
Next()MakeNull()First()End()number()

顺序表:

该顺序表设置与《数据结构与算法》(廖明宏)中设置相同,数组索引下标为0处不存放数值。

  • 结构体定义
#include<iostream>
using namespace std;
#define maxsize 100
typedef int ElemType,position;
struct List{
	ElemType *data;  
	int last;  //最后一个元素在数组中的位置
};
  • Init(List) 初始化
void Init(List &L)
{
	L.data= new ElemType[maxsize];
	L.last = 0;
}
  • Insert(x,p,L) 在第p个位置插入
void Insert(ElemType x,position p,List &L)
{
	if(L.last==sizeof(L)-1)
	{
		cout<<"线性表已满,插入失败"<<endl;
	}
	else if(p<1||p>L.last+1)
	{
		cout<<"插入索引越界,插入失败"<<endl;
	}
	else
	{
		for(int j=L.last;j>=p;j--)
			L.data[j+1]=L.data[j];
		L.data[p]=x;
		L.last++;
	}
}
  • Locate(x,L) 返回元素x的位置
position Locate(ElemType x,List L)
{
	for(int j=1;j<=L.last;j++)
	{
		if(L.data[j]==x)
			return j;
	}
	return End(L);
}
  • Retrieve(p,L) 返回第p个位置的元素
ElemType Retrieve(position p,List L)
{
	if(p<1||p>=End(L))
	{
		cout<<"索引越界"<<endl;
		return 0;
	}
	else
		return L.data[p];
}
  • Delete(p,L) 删除第p个元素
void Delete(position p,List &L)
{
	if(p<1||p>L.last)
	{
		cout<<"索引越界,无法删除"<<endl;
	}
	else
	{
		for(position j=p;j<L.last;j++)
		{
			L.data[j]=L.data[j+1];
		}
		L.last--;
	}
}
  • Previous(p,L) 返回第p个元素的前驱位置
position Previous(position p,List L)
{
	if(p<=1||p>=End(L))
		cout<<"没有前驱"<<endl;
	else
		return p-1;
}
  • Next(p,L) 返回第p个元素的后继位置
position Next(position p,List L)
{
	if(p<1||p>=L.last)
		cout<<"没有后继"<<endl;
	else
		return p+1;
}
  • MakeNull(L) 将表置空
int MakeNull(List &L)
{
	L.last=0;
	return End(L);
}
  • First(L) 返回表L的第一个元素的位置
int First(List L)
{
	if(L.last>=1)
		return 1;
	else
	{
		cout<<"该表是空表"<<endl;
		return 0;
	}
}
  • End(L) 返回表L的最后一个元素的位置
int End(List L)
{
	return L.last+1;
}
  • number(x,L) 统计L中元素x的个数
int number(ElemType x,List L)
{
    int count=0;
    for(int i=1;i<=L.last;i++)
    {
        if(L.data[i]==x)
            count++;
    }
    return count;
}

链表:

此链表为带头节点的链表

  • 结构体定义
#include<iostream>
using namespace std;
#define maxsize 100
typedef int ElemType;
typedef struct Node{
    ElemType data;
    Node *next;
} Node,*Linklist;
  • Init(Linklist) 初始化
void Init(Linklist &L)
{
    L=new Node;
    L->next=NULL;
}
  • Insert(x,p,L) 在第p个位置插入
void Insert(ElemType x,int position,Linklist &L)
{
    Linklist p=L,s=NULL;
    if(position<1)
        cout<<"索引越界"<<endl;
    	return ;
	for(int i=0;p&&i<position-1;i++)
        p=p->next;
    if(!p)
        cout<<"索引越界"<<endl;
    	return ;
    s=new Node;
    s->data=x;
    s->next=p->next;
    p->next=s;
    return ;
}
  • Locate(x,L) 返回元素x位置的前驱
Linklist Locate(ElemType x,Linklist L)
{
	Linklist p;
    for(p=L;p->next!=NULL;p=p->next)
        if(p->next->data==x)
            return p;
    return p;
}
  • Retrieve(p,L) 返回第p个位置的元素
ElemType Retrieve(Linklist p,Linklist L)
{
    return p->next->data;
}
  • Delete(p,L) 删除第p个节点
void Delete(int position,Linklist L)
{
    if(position<1)
    {
        cout<<"索引越界"<<endl;
        return ;
    }
    Linklist p=L;
    for(int j=0;p->next&&j<position-1;j++)
        p=p->next;
    if(!p->next)
    {
    	cout<<"索引越界"<<endl;
    	return ;
    }
    else
    {
        Linklist q=p->next;
        p->next=q->next;
        delete q;
    }  
}
  • Previous(p,L) 返回第p个元素的前驱位置
Linklist Previous(Linklist p,Linklist L)
{
    if(p==L->next)
    {
        cout<<"没有前驱"<<endl;
        return NULL;
    }
    else
    {
        Linklist q=L;
        while(q->next!=p)
            q=q->next;
        return q;
    }
}
  • Next(p,L) 返回p指向元素的后继
Linklist Next(Linklist p,Linklist L)
{
    if(!(p->next))
    {
        cout<<"没有后继"<<endl;
        return NULL;
    }
    else
        return p->next;
}
  • MakeNull(L) 将表置空
Linklist MakeNull(Linklist &L)
{
    L=new Node;
    L->next==NULL;
    return L;
}
  • First(L) 返回表L的第一个元素的位置
Linklist First(Linklist L)
{
    return L;
}
  • End(Linklist L) 返回表L的最后一个元素的位置
Linklist End(Lisklist L)
{
    Linklist q=L;
    while(q->next!=NULL)
    {
        q=q->next;
    }
    return q;
}
  • number(x,L) 统计L中元素x的个数
int number(ElemType x,Linklist L)
{
    int count=0;
    Linklist p=L->next;
    while(p)
    {
        if(p->data==x)
            count++;
        p=p->next;
    }
    return count;
}

  • 如果觉得有用,不妨推荐给周围需要的人,共同进步!!
  • 以上内容为本人自己手写,如有疏漏或者错误,还望读者能及时提醒,感谢感谢!!!
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值