类实现--单链表基本操作(C++)

类实现,单链表

节点类 Node

节点 应包括数据值 data 以及指向下一个节点的指针 next。
#include<iostream>
using namespace std;
typedef int DataType; //自定义数据类型
class Node
{
public:               //对节点类私有数据相关操作函数
	Node() {}
	~Node() {}
	void SetData(DataType tempdata) { data = tempdata; }
	DataType GetData() { return data; }
	void SetNext(Node *tempnode) { next = tempnode; }
	Node* GetNext() { return next; }
private:             //节点数据私有保护
	DataType data;
	Node *next;
};
//下接calss LinkList

链表类 LinkList

链表类作为主类,对链表中的节点进行操作(增、删、改、查…)
  • 此链表没有哨兵节点(即 head 指向的就是第一个节点) ;
  • 相关注释写于代码中;
class LinkList
{
private:
	Node *head;		//指向首节点
	Node *last;		//指向最后一个节点
	int length;		//链表长度
public:
	LinkList()
	{
		head = NULL;
		last = NULL;
		length = 0;
	}
	~LinkList()		//析构函数,释放节点
	{
		if (head != NULL)
		{
			Node *temp = NULL, *p = NULL;
			temp = head;
			while (temp != NULL)
			{
				p = temp;
				temp = temp->GetNext();
				delete p;
			}
		}
	}
    void display()		//测试函数
    {
        Node *temphead = head;		//注意:最好在函数内部申请临时首指针,以免破坏首指针;
        while(temphead  != NULL)
        {
            cout<<temphead->GetData()<<" ";
            temphead = temphead->GetNext();		//打印后指向下一个
        }
        cout<<endl;
    }
    DataType get(int index)		//返回对应索引位置上的节点值(0~index)
    {
        if(index > length || index < 0)
            return -1;
        Node *temp = head;
        int i = 0;
        while(i < index)
        {
            temp = temp->GetNext();
            i++;
        }
        return temp->GetData();
    }
    void addAtHead(int val) 		//从首位置添加节点
    {
        Node *temphead = head;
        Node *a = new Node();		//申请新节点
        a->SetData(val);
        a->SetNext(temphead);
        if(length==0)
        {
            last = a;		//last指针指向最后一个
        }
        head = a;
        length++;
    }

    void addAtTail(int val) {
        if(length == 0)		//相当于从首位置插入,注意尾指针的指向
        {
            Node *a = new Node();
            a->SetData(val);
            a->SetNext(NULL);
            head = a;
            last = a;
            length++;
        }else{				//直接从尾部插入节点
            Node *templast = last;
            Node *a1 = new Node();
            a1->SetData(val);
            a1->SetNext(templast->GetNext());
            templast->SetNext(a1);
            last = a1;
            length++;
        }
    }
    void addAtIndex(int index, int val) 		//在索引 index 后插入节点;若在 index 前插入节点,出入参数可以改变为 index-1
    {
        if(index > length || index < 0)
        {
            return ;
        }
        else if(index == length)		//如果索引值等于链表长度,则从尾部插入
        {
            addAtTail(val);
        }
        else{
            Node *temphead = head;
            int i = 0;
            while(i < index)
            {
                temphead = temphead->GetNext();
                i++;
            }
            Node *pnext = temphead->GetNext();
            Node *a = new Node();
            a->SetData(val);
            a->SetNext(pnext);
            temphead->SetNext(a);
            length++;
        }
    }

    void deleteAtIndex(int index)		//删除 index 位置处的节点
     {
        if(index > length || index < 0)
        {
            return ;
        }
        else if(index == 0){		//节点在首位置
            Node *temphead = head;
            head = head->GetNext();
            delete temphead;
            length--;
        }else if(index == length - 1 && index != 0){		//节点在尾部
            Node *templast = last;
            Node *temp = head;
            while(temp->GetNext() != templast)
            {
                temp = temp->GetNext();
            }
            last = temp;
            last->SetNext(NULL);
            delete templast;
            length--;
        }else{					//节点在一般位置
            int i = 0;
            Node *temphead = head;
            while(i < index - 1)
            {
                temphead = temphead->GetNext();
                i++;
            }
            Node *pnext = temphead->GetNext();
            Node *q = pnext;
            temphead->SetNext(q->GetNext());
            length--;
            delete q;
        }
    }
    Node* reverseList()		//链表反转
     {
        if (!head){ return NULL; }
        Node *p, *r;
        p = head->GetNext();
        head->SetNext(NULL);
        while (p != NULL)
        {
            r = p->GetNext();
            p->SetNext(head);
            head = p;
            p = r;
        }
        return head;
    }
};

测试

int main()
{
    cout<<"索引值:0--index;"<<endl;
	LinkList a;
	a.addAtHead(1);
	a.display();
	a.addAtTail(2);
	a.display();
	a.addAtTail(3);
	a.display();
	a.addAtTail(4);
	a.display();
	a.addAtTail(5);
	a.display();
	a.addAtTail(6);
	a.display();
    cout<<endl<<"删除索引值2位置处的节点;"<<endl;
	a.deleteAtIndex(2);
	a.display();
    cout<<endl<<"删除索引值1位置后添加节点9;"<<endl;
	a.addAtIndex(1,9);
	a.display();
	cout<<endl<<a.get(2)<<endl;
	return 0;
}

整数形(int)测试结果

在这里插入图片描述

字符型(char) 测试结果

稍作修改,见下
#include<iostream>
using namespace std;
typedef char DataType; //自定义数据类型;int 改为 char
测试
int main()
{
    cout<<"索引值:0--index;"<<endl;
	LinkList a;
	a.addAtHead('a');
	a.display();
	a.addAtTail('b');
	a.display();
	a.addAtTail('c');
	a.display();
	a.addAtTail('d');
	a.display();
	a.addAtTail('e');
	a.display();
	a.addAtTail('f');
	a.display();
    cout<<endl<<"删除索引值2位置处的节点;"<<endl;
	a.deleteAtIndex(2);
	a.display();
    cout<<endl<<"删除索引值1位置后添加节点9;"<<endl;
	a.addAtIndex(1,'9');
	a.display();
	cout<<endl<<a.get(2)<<endl;
	return 0;
}
测试结果

在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值