数据结构之单链表的实现c++

链表的实现1.0版本c++

是一些基本的链表实现,其中包含创建、插入、删除删除连在一起的相同结点。很多地方省略了对空链表的讨论,记得理解头节点的存在对于链表的影响。(ps:只是自己的学习记录)

代码如下

#include <iostream>
using namespace std;
#define Node elemtype
class Node {
public:
    int data;
    Node * next;
};
class LinkList
{
public:
    LinkList();
    ~LinkList();
    void CreateList(int i);
    int Getlength();
    void Insertelem(int n,int e);
    void Deleteelem(int m);
    void Deletesame();
    void Display();
private:
    int length;
    Node* head;
};
LinkList::LinkList()
{
    head = new elemtype;
    head->next = NULL;
    length = 0;
}
LinkList::~LinkList()
{
    delete head;
}
void LinkList::CreateList(int i)
{
    int n;
    Node *p=head,*s;
    if (i< 0)
    {
        cout << "The number is wrong!" << endl;
        exit(EXIT_FAILURE);
    }
    for (n = 0; n < i; n++)
    {
        s = new elemtype;
        cout << "Please enter the " << n +1<< " data" << endl;
        cin >> s->data;
        s->next = NULL;
        p->next = s;
        p = s;
    }
    length = n;
}
void LinkList::Deleteelem(int m)
{
    if (m > length)
    {
        cout << "The input is wrong!" <<endl;
        exit(EXIT_FAILURE);
    }
    Node* p = head, *s;
    s = new elemtype;
    int i;
    for (i = 1; i < m; i++)
    {
        p = p->next;
    }
    s = p->next;
    p->next = s->next;
    delete s;
    length--;
}
void LinkList::Deletesame()
{
    Node* p = head->next,*s;
    while (p->next)
    {
        s = p->next;
        if (s->data == p->data)
        {
            p->next = s->next;
            free(s);
            length--;
            continue;
        }
        else p = p->next;
    }
}
//这个函数只能删除1->2->2这种相同项,只要原因是在if和else的条件上。
void LinkList::Insertelem(int n,int e)
{
    if (n < 0)
    {
        cout << "wrong!" << endl;
        exit(EXIT_FAILURE);
    }
    Node* p=head,* s;
    int i;
    s = new elemtype;
    for (i = 1; i < n&&p!=NULL; i++)
    {
        p = p->next;
    }
    s->data = e;
    s->next = p->next;
    p->next = s;
    length++;
}
int LinkList::Getlength()
{
    return length;
}
void LinkList::Display()
{
    Node* p=head->next;
    int i=1;
    if (head->next==NULL)
    {
        cout << "This is a NULL Linklist." << endl;
    }
    while (p)
    {
        cout << "This is the " << i << " data: " << p->data << endl;
        p = p->next;
        i++;
    }
}

int main()
{
    LinkList L;
    L.CreateList(4);
    L.Display();
    L.Deletesame();
    L.Display();
    L.Insertelem(2, 3);
    L.Display();
    L.Deleteelem(1);
    L.Display();
    cout << L.Getlength() << endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值