数组仿真链表

本文探讨了如何利用数组来模拟链表的功能,虽然数组无法像真正的链表那样动态分配内存,但可以通过特定的实现方式达到类似的效果。提供了一段参考代码作为实现示例。
摘要由CSDN通过智能技术生成

实际上,可以用数组仿真链表的各项功能,当然数组仿真链表不具备动态开辟内存空间的特点。

参考代码如下:

//数组仿真链表
#include<iostream>
#define MAXN 100001                    //链表中最多容纳的元素数+1
using namespace std;

int linklst_data[MAXN];                //链表中元素的数据
int linklst_point[MAXN];               //链表中元素的指针
int head=-1;                           //链表的头指针
void del_by_data(int del_data)         //删除一个含有del_data的元素
{
    int p=head,pre=-1;                 //从头开始遍历链表
    while(p!=-1)
    {
        if(linklst_data[p]==del_data)  //如果找到要删除的值,则进行删除操作
        {
            if(p==head)                //如果删除的是头指针,则更新头指针
                head=linklst_point[head];
            else                       //这个else等同于if(pre!=1)因为当p!=head时前面已经有元素了
                linklst_point[pre]=linklst_point[p];
            linklst_data[p]=-1;        //删除p指向的元素的值
            linklst_point[p]=-1;
            return;                    //结束删除操作
        }
        pre=p;
        p=linklst_point[p];
    }

}

void add_front(int add_data)            //在链表前段加入元素
{
    int p=1;
    while(linklst_data[p]!=-1&&p<MAXN)  //找一空位存储数据,这里可以优化
        ++p;
    linklst_data[p]=add_data;           //将要加入的结点选好的空位赋值
    linklst_point[p]=head;              //将当前加入元素的指针指向head
    head=p;                             //使当前的元素成为链表的头指针
}
void add_rear(int add_data)
{
    int p=1,pre;
    while(linklst_data[p]!=-1&&p<MAXN)   //找到空位
        ++p;
    linklst_data[p]=add_data;            //该空位赋值
    if(head!=-1)
    {
        pre=head;                        //找到链表中的最后一个元素
        while(linklst_point[pre]!=-1)    //找到空指针
            pre=head;                    //找到链表中的最后一个元素
        linklst_point[pre]!=p;           //将当前链表中最后一个元素的指针指向要加入的元素
    }
    else
        head=p;
    return ;
}


void output()
{
    int p=head;
    cout<<"List is :";
    while(p!=-1)
    {
        cout<<linklst_data[p]<<" ";
        p=linklst_point[p];
    }
    cout<<"\n";
}

void init()                              //初始化数数组指针值
{
    for(int i=0; i<MAXN; i++)            //链表中的空值设定为-1
    {
        linklst_point[i]=-1;
        linklst_data[i]=-1;
    }
}

int main()
{
    int ins,data;
    init();
    while(1)
    {
        cout<<"1.Insert a value in front \n";
        cout<<"2.Insert a value in rear \n";
        cout<<"3.Delete a value \n";
        cout<<"4.Quit\n";
        cin>>ins;
        switch(ins)
        {
        case 1:
            cout<<"Please insert a value:";
            cin>>data;
            add_front(data);
            break;
        case 2:
            cout<<"Please insert a value:";
            cin>>data;
            add_rear(data);
            break;
        case 3:
            cout<<"Please insert a value:";
            cin>>data;
            del_by_data(data);
            return 0;
        }
        output();
    }
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值