自己实现的链表(单链表、双链表)

本文介绍了单链表和双链表的数据结构实现方法,包括插入、删除、查找等基本操作,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期学习的算法与数据结构

自己按照原理实现的单链表

List.h:

/****************************************************************************************
*program: to come true the struct of list
*autor: kingduo
*date: 2015/4/18 First Release
*      2015/5/5  Second Release make the list simple :change the Node* head 
*      make the head = NULL in the initial , change the head->next to head  
*      change the all function about the head point.Change the Clear() by using ~List()
*****************************************************************************************/
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include "Node.h"

using namespace std;

class List
{
public:
    List();
    ~List();
    bool IsEmpty();
    void Insert(int count, long value);
    void Delete(long value);
    void Clear();
    int Find(long value);
    void Swap(long val1, long val2);
    void Print();
private:
    Node* head;
    int size;
};
#endif

List.cpp:
#include "List.h"
#include <cstdlib>

List::List()
{
    head = NULL;
    size = 0;
}

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

bool List::IsEmpty()
{
    return (head == NULL);
}


void List::Insert(int count, long value)
{
    if(count< 0)
    {
        cout<<"Plese input the count ( >= 0)!"<<endl;
    }
    else
    {
        Node* newnode = new Node;
        newnode->value = value;
        if(IsEmpty())
        {
            newnode->next = NULL;
            head = newnode;
        }else if(count == 0)    //判断是否是第一个节点
        {
            newnode->next = head;
            head = newnode;
        }else if(count > 0 && count <= size)  //当索引号大于一个节点的插入
        {
            Node* prenode = head;
            for(int i = 1; i < count; i++)   // 获得要插入节点的前一个节点
                prenode = prenode->next;
            newnode->next = prenode->next;
            prenode->next = newnode;
            
        }else 
        {
                cout<<"Please input the number (< the large count)"<<endl;
                return ;
        }
        size ++;
    }
}

void List::Delete(long value)
{
    if(IsEmpty())
        cout<<"The list is empty! Please input number"<<endl;
    else
    {
        int judge = Find(value);
        if(judge >= 0)
        {            
            Node* prenode = head;
            if(prenode->next == NULL)
            {
                head = NULL;
                delete prenode;
            }else
            {
                for(int i = 1; i < judge; i++)  //获得要删除的节点的前一个节点
                    prenode = prenode->next;
                Node* deletenode = prenode->next;
                prenode->next = deletenode->next;
                delete deletenode;
            }
            size--;
        }else
            cout<<"No Find!"<<endl;
    }
}

void List::Clear()
{
    List::~List();
    cout<<"clear the list"<<endl;
}

int List::Find(long value)
{
    int i = 0;
    Node* findnode = head;
    while (findnode != NULL)
    {
        if(findnode->value == value)
            return i;
        findnode = findnode->next;
        i++;
    }
    return -1;
}

void List::Swap(long val1, long val2)  //交换两个相邻节点
{
    if(val1 == val2)  
        cout<<"the two value is one number!"<<endl;
    else
    {
        int num1 = Find(val1);
        int num2 = Find(val2);
        int num = -1;
        if((num1 == -1) && (num2 == -1))
            cout<<"No Find!"<<endl;
        else
        {
            if(abs(num1 - num2) == 1)  //判断输入的两个值是否为相邻节点
            {
                if( num1 > num2)  //找到两节点中排在前面的节点
                    num = num2;
                else num = num1;
                Node* prenode = head;
                if(num == 0)
                {
                    prenode = head;
                    head = prenode->next;
                    prenode->next = prenode->next->next;
                    head->next = prenode;
                }else
                {
                    for(int i = 1; i < num ; i++)
                        prenode = prenode->next;
                    Node* val1node = prenode->next;
                    prenode->next = val1node->next;
                    val1node->next = val1node->next->next;
                    prenode->next->next = val1node;
                }
            }
            else
                cout<<"Please input the adjancent elements!"<<endl;
        }
    }
}

void List::Print()
{
    if(IsEmpty())
        cout<<"The list is empty"<<endl;
    else
    {
        Node* loop_node = head;
        while(loop_node != NULL)
        {            
            cout<<loop_node->value<<endl;    
            loop_node = loop_node->next;
        }
    }
}
按照原理实现的双链表:

DoubleList.h:

/*******************************************************************
*program: to come true doublelist
*autor: kingduo
*date: 2015/4/18 First Realse
********************************************************************/
#ifndef DOUBLELIST_H
#define DOUBLELIST_H

#include "Node.h"

class DoubleList
{
public:
	DoubleList();
	~DoubleList();
	bool IsEmpty();
	void Insert(int count, long value);
	void Delete(long value);
	void Clear();
  	int IsFind(long value);
	void Swap(long val1, long val2);
	void Print();
private:
 	Node* head;
        int size;
};
#endif 

DoubleList.cpp:
#include "DoubleList.h"
#include <iostream>
#include <cstdlib>

using namespace std;

DoubleList::DoubleList()
{
	head = new Node;
	head->next = NULL;
	head->last = NULL;
	size = 0;
}

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

bool DoubleList::IsEmpty()
{
	return (head->next == NULL);
}

void DoubleList::Insert(int count, long value)
{
	if(count < 0)
		cout<<"Please input the count(> 0)."<<endl;
	else
	{
		Node* newnode = new Node;
		newnode->value = value;
		if(IsEmpty())
		{
			newnode->next = head->next;
			newnode->last = head;
			head->next = newnode;
		}else
		{
			if(count > size)
				{
					cout<<"Please input the count(< the large count)."<<endl;
					return ;
				}	
			else if(count == size)  //判断是否是最后的节点
			{
				Node* currentnode = head;
				for(int i = 0; i < count; i++)
					currentnode = currentnode->next;
				newnode->last = currentnode;
				newnode->next = currentnode->next;
				currentnode->next = newnode;
			}else if(count >= 0)  //非最后节点的添加
			{
				Node* currentnode = head;
				for(int i = 0; i <= count; i++)
					currentnode = currentnode->next;
				newnode->last = currentnode->last;
				newnode->next = currentnode;
				currentnode->last->next = newnode;
			}
		}
		size++;
	}
}

void DoubleList::Delete(long value)
{
	if(IsEmpty())
		cout<<"The list is empty! Please input number"<<endl;
	else
	{
		int num;
		num = IsFind(value);
		if(num >= 0)
		{
			Node* deletenode = head;
			for(int i = 0; i <= num; i++)
				deletenode = deletenode->next;
			if(num == size - 1)  //判断是否是最后节点
			{
				deletenode->last->next = deletenode->next;
				deletenode->next = NULL;
			}
			if(num < size - 1)  //删除非最后的节点
			{
				deletenode->last->next = deletenode->next;
				deletenode->next->last = deletenode->last;
			}
			delete deletenode;
			size--;
		}else
			cout<<"No Find!"<<endl;
	}
}

void DoubleList::Clear()
{
	while(head->next != NULL)
        {
               Node* deletenode = head->next;
               head->next = deletenode->next;
               delete deletenode;
        }
	cout<<"The doublelist is clear!"<<endl;
}

int DoubleList::IsFind(long value)
{
	int i = 0;
	Node* findnode = head->next;
	while(findnode != NULL)
	{
		if(findnode->value == value)
			return i;
		findnode = findnode->next;
		i++;
	}
	return -1;
}

void DoubleList::Swap(long val1, long val2)
{
	if(val1 == val2)  
		cout<<"the two value is one number!"<<endl;
	else
	{
		int num1 = IsFind(val1);
		int num2 = IsFind(val2);
		int num = -1;
		if((num1 == -1) && (num2 == -1))
			cout<<"No Find!"<<endl;
		else
		{
			if(abs(num1 - num2) == 1)  //判断输入的两个值是否为相邻节点
			{
				if( num1 > num2)  //找到两节点中排在前面的节点
					num = num2;
				else num = num1;
				Node* val1node = head;
				for(int i = 0; i <= num ; i++)
					val1node = val1node->next;
				Node* val2node = val1node->next;
				if(num == (size - 2))  //交换倒数的两个节点
				{
					val1node->last->next = val2node;
					val2node->last =val1node->last;
					val1node->next = val2node->next;
					val2node->next = val1node;
					val1node->last = val2node;
				}
				if(num < (size - 2))  //交换非倒数的两个节点
				{
					val1node->last->next = val2node;
					val2node->last =val1node->last;
					val1node->next = val2node->next;
					val2node->next->last = val1node;
					val2node->next = val1node;
					val1node->last = val2node;
				}
			}
			else
				cout<<"Please input the adjancent elements!"<<endl;
		}
	}
}
void DoubleList::Print()
{
	if(IsEmpty())
		cout<<"The list is empty"<<endl;
	else
	{
		Node* node = head->next;
		while(node != NULL)
		{			
			cout<<node->value<<endl;	
			node = node->next;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值