c++: 《数据结构》操作链表

1. ListNode 线性链表

1.1 类定义

class oprateList
{
public:
    /*创建链表*/
    void createList(ListNode*, int);
    /*输出链表*/
    void outputList(ListNode *);
    /*链表长度*/
    int lengthOfList(ListNode *);
    /*链表元素取值*/
    int getValue(LinkList *);
    /*定位插入元素*/
    void insertList(ListNode*,int,int)
    /*删除定位元素*/
    void deleteE(ListNode*,int)
    /*删除链表元素*/
    void deleteList(ListNode *);
}

1.2 结构体

//定义表结点的数据结构:数据+指针
struct ListNode{
    int val;
    ListNode * next;
}

1.3 创建链表

void operateList::createList(ListNode * head,int n)
{
    int i = 0;
    //避免破坏头指针
    ListNode * phead = head;
    //插入 n-1 个元素
    for(i = 1;i < n;i++)
    {
        //动态创建新的链表节点并初始化
        ListNode * node = new ListNode;
        node->val = i;
        node->next = NULL;
        //辅助指针先是把新创建的节点接到链表的结尾
        phead->next = node;
        //辅助指针后移指向最新的节点
        phead = node;
        //delete node;    此处不能释放,phead = node,是链表的最后一个节点
    }
    //head = head->next;    头指针指向第一个元素
}

1.4 输出链表

void operateList::outputList(ListNode * linkList)
{
    if(linkList == NULL || linkList->next == NULL)
    {
        //链表为空
        return;
    }
    else
    {
        LinkNode* p = linkList;
        while(p->next != NULL)
        {
            p = p->next;
            cout << p->value << " ";
        }
    }
}

1.5 链表长度

int operateList::lengthOfList(ListNode * linkList,int n)
{
    if(linkList == NULL || linkList->next == NULL)
    {
        //链表为空
        return 0;
    }
    else
    {
        int count = 0;
        LinkNode* p = linkList;
        while(p->next != NULL)
        {
            p = p->next;
            count ++;
        }
        return count;
    }
}

1.6 链表元素取值

int operateList::getValue(ListNode * linkList,int index)
{
    if(index <= lengthOfList(linkList))
    {
        LinkList *p = linkList;
        //定位到索引节点
        for(int i = 0;i < index;i ++)
        {
            p = p->next;
        }
        return p->value;
    }
    else
    {
        //索引越界
        return -1;
    }
}

1.7 定位插入元素

void operateList::insertList(ListNode* linkList,int site,int e)
{
    if(site <= lengthOfList(linkList))
    {
        LinkList *p = linkList;
        //定位到索引节点
        for(int i = 0;i < site;i ++)
        {
            p = p->next;
        }
        ListNode* pTemp = new ListNode;
        pTemp->value = e;
        //辅助指针连接链表后的所有节点
        pTemp->next = p->next;
        //链表连接辅助指针
        p->next = pTemp;
        cout << "插入元素成功";
    }
    else
    {
        //索引越界
        cout << "索引越界";
        return;
    }
} 

1.8 删除定位节点

void operateList::deleteE(ListNode * linkList,int site)
{
    if(site <= lengthOfList(linkList))
    {
        LinkList *p = linkList;
        //定位到索引节点
        for(int i = 0;i < index;i ++)
        {
            p = p->next;
        }
        ListNode* pTemp = new ListNode;
        pTemp = p->next;
        p->next = pTemp->next;
        delete pTemp;
        cout << "删除元素成功";
    }
    else
    {
        //索引越界
        return -1;
    }
}

1.9 删除链表元素

void operateList::deleteList(ListNode * linkList)
{
    //头节点
    ListNode* p = linkList->next;
    while(p != NULL)
    {
        ListNode* pTemp = p;
        p = p->next;
        //删除下一节点
        delete pTemp;
    }
    //头节点指向空元素
    linkList->next = NULL;
    cout << "删除链表成功";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值