c++实现list类(第一次用类) —— new对象需delete

一:起因

(1)拿出自己年初实现的list,第一次用c++类实现list或者说第一次写一个工程上用到的list类,在和如今实现的list对比,心情无比复杂;

(2)说明了一点,我也曾经幼稚过,现在还比较幼稚,但我相信,只要坚持最初梦想的人,终究会走向成熟;

(3)更加详细的比较全的list   请看   STL list类源代码实现  

(4)再次感谢自己能坚持最初的梦,相信你也有一个类似的梦;不要羡慕别人天赋,别人的成功是无法复制的,别人的辉煌是不会重演的;唯有我们自己脚踏实地的走好每一步,播下我们自己梦想的种子,大步向前。

二:详细代码如下:以下是代码和一些个人心得,欢迎大家指点~

(1)LinkList类的简单实现

struct Node
{
    int data;
    Node *next;
};
class LinkedList
{
    public:
        LinkedList(const int &n);// n 链表长度
        LinkedList(const LinkedList &aplist);
        ~LinkedList();
        void display();
        void insert_before(const int &key,const int &toinsert);
        void del(const int &todelete);
        Node* find_key(const int &key);
        void distroy();
        int getLength();
    private:
        Node *head;
        Node *cur;
};// 类的后面和 结构体一样,必须加 分号 (;)

LinkedList::LinkedList(const int &n)
{
    head = new Node;
    head->data = -1;// 此元素是一个标示符
    head->next = NULL;// init head
    Node *p = head;// p in the left of cur
    int i;
    cout << "请输入链表序列:" << endl;
    for(i=0;i<n;i++)
    {
        cur = new Node;
        cin >> cur->data;
        cur->next = NULL;
        p->next = cur;
        p = cur;
    }
}
LinkedList::~LinkedList()
{
    cout << "***";
    distroy();
}
void LinkedList::display()
{
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return;
    }
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表为空!" << endl;
        return;
    }
    while(cur != NULL)
    {
        cout << cur->data << " ";
        cur = cur->next;
    }
    cout << endl;// 多一个空格的
}

void LinkedList::del(const int &todelete)
{
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return;
    }
    Node *p = head;
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表为空,删除失败!" << endl;
        return;
    }
    while(cur!=NULL && cur->data!=todelete)
    {
        p = cur;
        cur = cur->next;
    }
    if(cur == NULL)
        cout << "此元素不存在,删除失败!" << endl;// 当然也可能此链表为空
    else
    {
        cout << "成功删除元素:" << cur->data << endl;
        p->next = cur->next;
        delete cur;
    }
}
void LinkedList::insert_before(const int &key,const int &toinsert)
{
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return;
    }
    Node *p,*tmp;
    p = head;
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表为空,插入失败!" << endl;// 当然也可能此链表为空
        return;
    }
    while(cur!=NULL && cur->data!=key)
    {
        p = cur;
        cur = cur->next;
    }
    if(cur == NULL)
        cout << key << ":此元素不存在,插入失败!" << endl;
    else
    {
       tmp = new Node;
       tmp->data = toinsert;
       tmp->next = NULL;
       p->next = tmp;
       tmp->next = cur;
       cout << "成功插入元素:" << toinsert << endl;
    }
}
Node* LinkedList::find_key(const int &key)
{
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return NULL;
    }
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表为空,查找失败!" << endl;
        return head;
    }
    while(cur!=NULL && cur->data!=key)
        cur = cur->next;
    if(cur == NULL)
    {
        cout << key << "此元素不在链表中,查找失败!" << endl;
        return head;
    }
    else
    {
        cout << "成功查找到元素:" << cur->data << endl;
        return cur;
    }
}

void LinkedList::distroy()
{
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return;
    }
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表已经为空,无法再次删除!" << endl;
        delete head;//销毁head节点
        head = NULL;// 用于后面的判断
        return;
    }
    while(cur != NULL)
    {
        head->next = cur->next;
        delete cur;
        cur = head->next;
    }
    if(head != NULL)
    {
        delete head;
        head = NULL;
    }
}
int LinkedList::getLength()
{
    int cp = 0;
    if(head == NULL)
    {
        cout << "此链表不存在!" << endl;
        return cp;
    }
    cur = head->next;
    if(cur == NULL)
    {
        cout << "此链表为空!" << endl;
        return cp;
    }
    while(cur != NULL)
    {
        cp ++;
        cur = cur->next;
    }
    return cp;
}

(2)main函数的测试

#include <iostream>
using namespace std;

// 主函数开始,main()
int main()
{
    int len,todelete,key,toinsert,tofind;// 当然也可以把一些变量同意命名为opt_key
    Node *tmp;
    int cp;
    cout << "请输入所要建立链表的长度:" << endl;
    cin >> len;
    LinkedList *list = new LinkedList(len);// new 出来的对象,用指针指向
    list->display();// 不能用list.display()的
    //LinkedList list = LinkedList(len);
    //list.display();// 注释的语句也是对的,但是必须都得改为 list.xxx;
    //而且new的对象(在堆上)必须手动delete,否则不调用析构函数,非new出来的对象,自动调用析构函数

    cout << "请输入所要删除的元素:" << endl;
    cin >> todelete;
    list->del(todelete);
    list->display();

    cout << "请输入所要查找的元素:" << endl;
    cin >> tofind;
    tmp = list->find_key(tofind);
    cout << "查找后返回main()的结果:" << tmp->data << endl;
    list->display();

    cout << "请输入所要插入的元素和其右侧元素:" << endl;
    cin >> toinsert >> key;
    list->insert_before(key,toinsert);
    list->display();

    cout << "销毁前的链表长度:";
    cout << list->getLength() << endl;
    list->distroy();
    cp = list->getLength();
    cout << "销毁后的链表长度:";
    cout << cp << endl;
    //list->~LinkedList();// 本以为是析构函数是不可以自动调用的,
    //其实不然,课本上明明说析构函数是可以自动调用的,但是有一个前提:对象的生存期即将结束的时
    //在函数结束时调用(栈内存即将销毁时),堆内存中对象是在delete时调用
    delete list;
    return 0;
}

三:心得和体会

(1)在C++中,普通的对象离开它的作用域之后,它的析构函数会被自动调用,从而销毁这个对象,释放它所占的内存,不会发生内存泄露的问题。

(2)new命令可以为对象在内存中动态分配一定的空间,并返回分配空间的首地址;如果在程序运行结束之前没有用delete来销毁这些对象,释放它们所占

用的空间也会发生内存泄露。

3)看到自己上面写的两条心得和体会,自己也扑哧笑了;再看自己写的代码 —— main函数和LinkList类竟然在一起;看来我当初真的幼稚了很多;

(4)再看看现在写的代码,完全不一样了,不过我还是感谢当初的我,那时的我选择的路;成熟是建立在幼稚的基础上的。

(5)最后摘抄的一句话,与大家共享 : 当你的才华撑不起你的野心时,只有静下心来好好学习! 纵使命运注定是个打酱油的,也要打一瓶与别人不一样的酱油!

时间: 2024-10-01 09:55:10

c++实现list类(第一次用类) —— new对象需delete的相关文章

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

Java Date类和Calendar类的一个控制台打印日期的小程序

Java Date类和Calendar类的一个打印日期的小程序,可以直接用. package com.boy.Idate.calendar; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 控制台可视化日历 * @author 田硕 */ public class VisualCalendar {

黑马程序员--Java基础学习笔记【Object类、String类】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Object类 在Java类继承结构中,java.lang.Object类位于顶端. 所有类都直接或间接继承Object类. (接口不能继承Object类,接口中隐含定义了Object类的所有公共方法,但是全抽象) Object类型的引用变量可以指向任何类型对象. Object类成员方法 public String toString() { return getClass().getName(

java中使用Pattern类中和Matcher类进行查找和替换,你会吗?

前言 无论是哪一门语言,我们总会用到正则表达式来进行字符串的查找和替换.Java中也不为过,我曾经写过一个网页---正则表达式在线测试.那时候,我还没有开始学习Java,不知道Java支持正则表达式,所以我的第一个方案是想办法将数据传输到后台,然后利用Shell脚本正则表达式得到匹配结果.如果后来真的那么做了,那就二了.后来我研究了以下别的类似的网站,发现甚至连js文件都不用写,直接将函数写在html文件中就能够完成这一个任务.一天的时间,我把这个网站给写了出来.所以,即使不是脚本型语言,了解以

.Net的String类与StringBuilder类操作

关于.NET提供了许多可以直接使用的类代码,常用的包括Convert类.String类和StringBuilder类.DateTimel类和TimeSpan类.Math类等等. 其中Convert类提供的方法都是静态方法,主要用于数据类型的转换: 例如: 字符串数据类型  -----> 整形 string str ="123"; int Getstr = Convert.Int32(str); 但要注意类型转换的取值范围. 当然DateTime类和TimeSpan类是针对时间这一

hive Context类和DriverContext类

在hive的源码中经常可以看到Context类和DriverContext类,咋一看感觉这两个意思差不多,其实其作用区别还是蛮大的: org.apache.hadoop.hive.ql.Context类存储job的上下文信息,一个job创建一个Context对象,job运行完后,调用clear方法进行清除1)初始化/创建/删除中间目录中间的目录包括local job的和非local job的 protected int pathid = 10000; private static final S

String类和StringBuffer类

一.String类 1.String类的获取功能 int length() 获取字符串的长度 char charAt(int index) 通过下标获取字符 int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引. int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引 int indexOf(int ch,int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始. int indexOf(Str

[01] Pattern类和Matcher类

在Java中,有个java.util.regex包,这是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它主要有两个类: Pattern   一个正则表达式经编译后的表现模式,可以理解为某正则的对应类 Matcher  匹配检查器,根据Pattern对象作为匹配模式对字符串进行匹配检查 1.Pattern 1.1 获取Pattern对象 Pattern类用于创建一个正则表达式,或者说创建一个匹配模式对象,我们不能直接创建,需要使用其静态方法compile实现: static Pat