数据结构复习——链表

1、链表的定义。

线性表的顺序存储的方式要求逻辑上相邻的元素在物理位置上也相邻。因而可以随机的访问顺序表中的任意元素。但是要插入或者删除一个元素需要大量的移动其他的元素。正是由于上述链表的顺序存储的缺点,提出了线性表的链式存储的方式,来改进插入或者删除带来的负面效应。但是,由于线性表的链式存储的方式并不要求逻辑上相邻的元素在物理位置上也相邻。因此,链式存储的线性表失去了随机访问线性表的元素的特性。

2、实现。

2-1、创建链表。

2-2、指定位置插入元素。

2-3、删除指定位置元素。

2-4、销毁链表。//To do

typedef struct ListEle
{
    unsigned data_;
    ListEle* next_;

    ListEle(unsigned value):
        data_(value),
        next_(nullptr)
    {
    }
}ListNode,*LinKList;

bool createListWithSize(LinKList& list,size_t n)
{
    LinKList p=list;
    ListNode* curNode=nullptr;
    //尾插法建立链表
    for(size_t i=0;i<n;++i)
    {
        curNode=new ListNode(i);
        p->next_=curNode;
        p=p->next_;
    }
    return true;
}

bool insertAEle(LinKList& list,size_t pos,int value)
{
    if(list==nullptr)
        return false;
    size_t curPos=0;
    ListNode* curNodePre=list;
    ListNode* curNode=list->next_;

    while(nullptr!=curNode&&curPos<pos)
    {
        curPos++;
        curNodePre=curNode;
        curNode=curNode->next_;
    }

    if(curPos!=pos)
        return false;

    ListNode* newNode=new ListNode(value);
    newNode->next_=curNode;
    curNodePre->next_=newNode;
    return true;
}

bool deleteSpecPosEle(LinKList& list,size_t pos,int& value)
{
    if(list==nullptr)
        return false;
    size_t curPos=0;
    ListNode* curNodePre=list;
    ListNode* curNode=list->next_;

    while(nullptr!=curNode&&curPos<pos)
    {
        curPos++;
        curNodePre=curNode;
        curNode=curNode->next_;
    }

    if(curPos!=pos||curNode==nullptr)
        return false;

    value=curNode->data_;
    curNodePre->next_=curNode->next_;
    delete curNode;
    curNode=nullptr;
    return true;
}

void destroyAList(LinKList& L)
{
    //To do
}

void showList(const LinKList& list)
{
    if(!list)
        return;
    LinKList curNode=list->next_;
    while(nullptr!=curNode)
    {
        std::cout<<curNode->data_<<"\t";
        curNode=curNode->next_;
    }

    std::cout<<std::endl;
}

//测试函数
int main()
{
    ListNode node(0);
    LinKList head=&node;
    createListWithSize(head,100);

    std::cout<<"before operation:\n";
    showList(head);

    insertAEle(head,6,1234);
    std::cout<<"after opearation 1:\n";
    showList(head);

    int a=-1;
    deleteSpecPosEle(head,7,a);
    std::cout<<a<<std::endl;

    std::cout<<"after opearation 2:\n";
    showList(head);

    return 0;
}

3、运行截图。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值