算法1:链表的基本操作

26 篇文章 0 订阅

算法1:链表的基本操作

编程实现链表的基本操作,包括插入,删除,查找,逆序,打印,获取长度等基本操作。

用c++实现如下:

定义LinkList头文件

#include <iostream>
#include <string.h>

//链表数据结构体
struct Node
{
    int data;
    Node* next;
    Node(int _data):data(_data),next(NULL){}
};

class LinkList
{
public:
    //构造函数
    LinkList();
    //析构函数
    ~LinkList();
    //链表头部插入节点
    void InsertHead(int data);
    //链表插入节点
    void Insert(int data,int pos);
    //链表删除节点
    void Remove(int data);
    //链表查找节点
    int Find(int data);
    //获取链表长度
    int Length();
    //打印链表
    void Print();
    //逆序操作
    void Reverse();

private:
    Node* head;
    int length;
};

LinkList实现如下:

#include "stdafx.h"
#include "LinkList.h"

using namespace std;

LinkList::LinkList()
{
    head = NULL;
    length = 0;
}

LinkList::~LinkList()
{
    Node* tmp;
    while(head != NULL)
    {
        tmp = head;
        head = head->next;
        delete tmp;
    }
}

void LinkList::Insert(int data,int pos)
{
    if(pos < 0)
    {
        cout<<"please input correct position: "<<pos<<endl;
        return;
    }

    Node* node = new Node(data);

    //pos=0表示插入头节点
    if(pos == 0)
    {
        node->next = head;
        head = node;
        length++;
        return;
    }

    int index = 1;
    Node* tmp = head;
    while(tmp != NULL && index < pos)
    {
        tmp = tmp->next;
        index++;
    }

    if(tmp == NULL)
    {
        cout<<"can't insert node in pos"<<pos<<endl;
        return;
    }

    node->next = tmp->next;
    tmp->next = node;
    length++;
}

void LinkList::InsertHead(int data)
{
    Insert(data,0);
}

int LinkList::Find(int data)
{
    Node* tmp = head;

    for(int i = 0; i < length; i++)
    {
        if(tmp != NULL && tmp->data == data)
        {
            return i+1;
        }

        tmp = tmp->next;
    }

    return -1;
}

void LinkList::Remove(int data)
{
    int pos = Find(data);

    if(pos < 0)
    {
        cout<<"this data is not exist, so can't remove it. data="<<data<<endl;
        return;
    }

    //需要考虑删除头节点的问题
    if(pos == 1)
    {
        head = head->next;
        length--;
        return;
    }

    int index = 2;
    Node* tmp = head;
    while(index < pos)
    {
        tmp = tmp->next;
        index++;
    }

    tmp->next = tmp->next->next;
    length--;
}

int LinkList::Length()
{
    return length;
}

void LinkList::Print()
{
    if(head == NULL)
    {
        cout<<"linklist is empty"<<endl;
        return;
    }

    Node* tmp = head;

    cout<<"linklist is ";
    while(tmp != NULL)
    {
        cout<<tmp->data<<"  ";
        tmp = tmp->next;
    }
    cout<<endl;
}

void LinkList::Reverse()
{
    if(head == NULL)
    {
        cout<<"linklist is empty";
        return;
    }

    Node* curNode = head;
    Node* nextNode = head->next;
    Node* tmp;

    while(curNode != NULL && nextNode != NULL)
    {
        tmp = nextNode->next;
        nextNode->next = curNode;
        curNode = nextNode;
        nextNode = tmp;
    }

    head->next = NULL;
    head = curNode;
}

编写测试代码如下:

int _tmain(int argc, _TCHAR* argv[])
{
    LinkList link;
    cout<<"insert head: ";
    int data;
    cin>>data;
    link.InsertHead(data);

    int length = 8;
    int index = 1;
    cout<<"insert data:";
    while(index < length)
    {
        cin>>data;
        link.Insert(data,index);
        index++;
    }

    cout<<"the result after insert:"<<endl;
    link.Print();

    cout<<"length = "<<link.Length()<<endl;

    cout<<"please input an exist data for testing remove function"<<endl;
    cin>>data;
    link.Remove(data);
    cout<<"length = "<<link.Length()<<endl;
    cout<<"the result after remove:"<<endl;
    link.Print();

    cout<<"please input an non-existent data for testing remove function"<<endl;
    cin>>data;
    link.Remove(data);
    cout<<"length = "<<link.Length()<<endl;
    cout<<"the result after remove:"<<endl;
    link.Print();

    cout<<"please input an exist data for testing find function"<<endl;
    cin>>data;
    cout<<"length = "<<link.Find(data)<<endl;

    cout<<"please input an non-existent data for testing find function"<<endl;
    cin>>data;
    cout<<"length = "<<link.Find(data)<<endl;

    cout<<"the result after reverse"<<endl;
    link.Reverse();
    link.Print();

    system("pause");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值