C++链表(LinkList)链表的创建、插入、删除等基本操作

下面是LinkList.h文件,包含链表的基本函数

#include<iostream>
#include"malloc.h"
#include"Node.h"
#include <exception>
#include <cstdlib>
using namespace std;

template < class T>
class LinkList
{
    friend ostream& operator<< <T>(ostream &out, LinkList<T> &list);//操作符重载,输出单链表的所有元素

public:
    LinkList();                      //构造函数 
    LinkList(T value[], int n);      //创建链表(利用数组进行创建)
    ~LinkList() { delete head; }     //析构函数
    Node<T>*head;                    //头指针,指向单链表的头结点
    Node<T>*InsertNode(int i, int d);//指定位置插入节点
    int GetLength();                 //链表长度
    T DeleteNode(int i);             //删除指定位置节点,返回删除的元素
    void DeleteAllNode();            //删除整个链表


};

template < class T>
ostream& operator<<(ostream &out, LinkList<T> &list)
{
    if (list.head == NULL)
    {
        cout << "链表为空!" << endl;
        return out;
    }
    for (Node<T> *p = list.head->Next; p!= NULL; p = p->Next)
    {
        cout << p->data << "  ";
    }
    return out;
}

template<class T>
LinkList<T>::LinkList()//创建空链表
{
    this->head = new Node<T>();
}

template < class T>
LinkList<T>::LinkList(T value[], int n)
{
    if (n <= 0)
    {
        cout << "链表个数不合理,请重新设定!" << endl;
    }
    this->head = new Node<T>();
    Node<T> *Temp = this->head;
    for (int i = 0; i < n; i++)
    {
        Temp->Next = new Node<T>();
        Temp->Next->data = value[i];
        Temp = Temp->Next;
    }
    Temp->Next = NULL;
}

template < class T>
Node<T>* LinkList<T>::InsertNode(int i, int d)
{
    Node<T>*p = this->head;
    int j = 0;
    while (p && j < i - 1)
    {
        p = p->Next;
        j++;
    }
    if (!p || j>i - 1)
    {
        throw out_of_range("指针为空或者i的取值不合法!");
    }
    Node<T>*s = new Node<T>();
    s->data = d;
    s->Next = p->Next;
    p->Next = s;

    return 0;
}

template <class T>
int LinkList<T>::GetLength()
{
    Node<T>*p = new Node<T>();
    p = this->head;
    int n = 0;
    while (p->Next != NULL)
    {
        n += 1;
        p = p->Next;
    }
    return n;
}

template <class T>
T LinkList<T>::DeleteNode(int i)
{
    Node<T>*p = new Node<T>();
    p = this->head;
    int j = 0; T e;
    while (p && j < i-1)
    {
        p = p->Next;
        j++;
    }
    if (!p || j>i-1)
    {
        throw out_of_range("该位置指针为空或者输入位置不合法!");
    }

    Node<T>*s = new Node<T>();
    e = p->data;
    s = p->Next;
    p->Next = s->Next;
    free(s);
    return e;
}

template <class T>
void LinkList<T>::DeleteAllNode()
{
    while (this->head != nullptr)
    {
        head = head->Next;
    }
}

在上面文件中,Node.h中是结点类的实现,代码如下:

template < class T>
class Node
{
public:
    T data;
    Node<T> *Next;
    Node()
    {
        this->Next = NULL;
    }
    Node(T data, Node<T>*Next = NULL)
    {
        this->data = data;
        this->Next = Next;
    }

};

下面是LinkList.cpp文件,包含主函数

#include<iostream>
#include"LinkList.h"
using namespace std;

int main()
{
    int a[5] = { 1, 4, 3, 6, 7 };
    //生成链表测试
    LinkList<int> list(a, 5);
    cout <<"生成的链表为:"<< list << endl;
    cout << "生成链表的长度为:" << list.GetLength() << endl;;

    //插入某位置元素测试
    list.InsertNode(3, 10);
    cout << "在第3个位置上插入数字10之后的新链表为:" << list << endl;

    //删除某位置元素测试
    list.DeleteNode(5);
    cout << "删除第5个位置的结点后的新链表为:" << list << endl;

    //删除所有元素测试
    list.DeleteAllNode();
    cout << "将元素全部删除!" << list << endl;
    return 0;
}

测试结果如下所示:

生成的链表为:1  4  3  6  7
生成链表的长度为:5
在第3个位置上插入数字10之后的新链表为:1  4  10  3  6  7
删除第5个位置的结点后的新链表为:1  4  10  3  7
将元素全部删除!链表为空!

请按任意键继续. . .
  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
单向链表的相关操作代码如下: 定义结构体: ```c typedef struct node{ int data; //数据域 struct node* next; //指针域 }Node, *LinkList; ``` 1. 初始化链表 ```c LinkList InitLinkList(){ LinkList L; L = (Node*)malloc(sizeof(Node)); //分配头结点空间 if (!L) { printf("内存分配失败!\n"); exit(0); } L->next = NULL; //头结点后继指针置空 return L; } ``` 2. 插入结点 ```c //在链表的第i个位置插入元素e bool InsertLinkList(LinkList L, int i, int e){ int j = 0; LinkList p = L, s; //查找第i-1个结点 while (p && j < i - 1) { p = p->next; j++; } if (!p || j > i - 1) { printf("插入位置不合法!\n"); return false; } //创建新结点并插入链表 s = (Node*)malloc(sizeof(Node)); s->data = e; s->next = p->next; p->next = s; return true; } ``` 3. 删除结点 ```c //删除链表的第i个结点 bool DeleteLinkList(LinkList L, int i){ int j = 0; LinkList p = L, q; //查找第i-1个结点 while (p->next && j < i - 1) { p = p->next; j++; } if (!p->next || j > i - 1) { printf("删除位置不合法!\n"); return false; } //删除第i个结点 q = p->next; p->next = q->next; free(q); return true; } ``` 4. 查找结点 ```c //按值查找元素e在链表中的位置 int LocateElem(LinkList L, int e){ int i = 0; LinkList p = L->next; while (p) { i++; if (p->data == e) { return i; } p = p->next; } return 0; } ``` 5. 遍历链表 ```c //遍历链表输出各结点的值 void TraverseLinkList(LinkList L){ LinkList p = L->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值