c++ 实现单向链表

2 篇文章 0 订阅
1 篇文章 0 订阅

终于有时间来复习复习数据结构了,使用的教材是《c++数据结构与算法》第四版,下面是在复习过程中一些简单的实现,权当练手的笔记和温习吧。可能有疏漏之处,还望见谅和指出,在此谢过  O(∩_∩)O~

下面把代码贴出来,其中有很详细的注释,在CodeBlocks中编译通过


在IntSLLish.h头文件中定义了链表节点IntSLLNode和链表IntSLList,其中head和tail分别指向链表的首节点和尾节点

</pre><pre name="code" class="cpp">// IntSLLish.h
#ifndef INT_LINKED_LIST
#define INT_LINKED_LIST
#include <iostream>
using namespace std; // 不能忘了,不然下面重载的<< 会报错
class IntSLLNode
{
public:
    IntSLLNode()
    {
        next = NULL;   //无参构造函数
    }
    IntSLLNode(int el)
    {
        info = el;
        next = NULL;
    }
    int info;
    IntSLLNode *next;
};

class IntSLList
{
public:
    IntSLList()
    {
        head = NULL;
        tail = NULL;
    }
    ~IntSLList();
    int isEmpty()
    {
        return head == NULL;   //判断链表是否为空
    }
    void addToHead(int);  //从首节点添加节点
    void addToTail(int);  //从尾节点添加节点
    int delFromHead();    // 从首节点删除节点
    int delFromTail();    // 从尾节点删除节点
    bool delNode(int);    // 删除指定的某一节点
    IntSLLNode* isInList(int); // 判断某一元素是否在链表中
    friend ostream& operator<<(ostream&, IntSLList&); //重载<<
private:
    IntSLLNode *head, *tail;  //head 指向链表的首节点,tail指向链表的尾节点
};


#endif // INTSSLNODE_H_INCLUDED

IntSLList.cpp是头文件IntSLLish.h中函数的实现

// IntSLList.cpp
#include <iostream>
#include <stdlib.h>
#include "IntSLList.h"
IntSLList::~IntSLList() //析构函数
{
    IntSLLNode *p;
    while(head)
    {
        p = head->next;
        delete head;
        head = p;
    }
}

// 从首节点处添加节点
void IntSLList:: addToHead(int el)
{
    IntSLLNode *temp = new IntSLLNode(el);
    if(head == NULL && tail == NULL) //链表为空
    {
        head = temp;
        tail = temp;
    }
    else if(head == tail && head != NULL) // 链表只有一个节点时
    {
        temp->next = tail;
        head = temp;
    }
    else    //链表节点个数>=2时
    {
        temp->next = head;
        head = temp;
    }
}

//从尾节点处添加节点
void IntSLList:: addToTail(int el)
{
    IntSLLNode *temp = new IntSLLNode(el);
    if(head == NULL && tail == NULL) //链表为空
    {
        head = temp;
        tail = temp;
    }
    else
    {
        tail->next = temp;
        tail = temp;
    }

}

// 从首节点处删除节点
int IntSLList::  delFromHead()
{
    int val ;
    if(head == tail && head != NULL&& tail != NULL)
    {
        val = head->info;
        delete head;
        head = tail = NULL;
    }
    if(head != tail )
    {
        val = head->info;
        IntSLLNode *temp = head;
        head = head->next;
        delete temp;
    }

    return val;
}

// 从尾节点处删除尾节点
int IntSLList:: delFromTail()
{
    int val;
    if(head == tail && head != NULL&& tail != NULL)
    {
        val = head->info;
        delete head;
        head = tail = NULL;
    }
    if(head != tail )
    {
        IntSLLNode *p = head;
        while(p->next != tail)
        {
            p = p->next;
        }
        val = tail->info;
        delete tail;
        p->next = NULL;
        tail = p;
    }
    return val;
}


//判断某一元素是否在链表中,返回该节点的指针,若元素不在链表中,则返回NULL
IntSLLNode* IntSLList::isInList(int el)
{

    IntSLLNode *p = NULL;
    if(head == NULL) // 若链表为空
    {
        return NULL;
    }
    else
    {
        p = head;
        while(p)
        {
            if(p->info == el)
                return p;
            p = p->next;
        }
    }

    return p;
}

// 删除链表中某一元素el
bool  IntSLList::delNode(int el)
{
    IntSLLNode *r = NULL, *p= head, *temp = NULL;
    r = isInList(el);
    if(r == NULL)
    {
        return false;   // 链表为空
    }
    else
    {
        if(r == head) //若el在首节点处
        {
            temp = head;
            head = head->next;
            delete temp;
        }
        else if(r == tail) // 若el在尾节点处
        {
            while(p->next!= tail)
            {
                p = p->next;
            }
            temp = tail;
            p->next = NULL;
            tail = p;
            delete temp;
        }
        else   //若el在中间的某处
        {
            while(p->next != r)
            {
                p = p->next;
            }
            temp = r;
            p->next = r->next;
            delete temp;

        }
        return true;
    }

}


//  /*

// 重载<<
ostream & operator<<(ostream  &output, IntSLList &head)
{
    IntSLLNode *p = head.head;
    if(p == NULL)
    {
        output << "linked list is empty!" ;
    }
    else
    {
        while(p)
        {
            output << p->info << " " ;
            p = p->next;
        }
    }
    return output;

}
//   */


下面是主函数:

// main函数
#include <iostream>
#include "IntSLList.h"

using namespace std;

int main()
{
    int a = 2;
    IntSLList list1;
    list1.addToHead(2); //从首节点处添加元素为2的节点
    list1.addToHead(1);
    list1.addToTail(3); //从尾节点处添加元素为3的节点
    list1.addToTail(4);
    //
    //IntSLLNode *node = list1.isInList(1);
//   bool flag = list1.delNode(3);
//   int del1 = list1.delFromHead();
    int del2 = list1.delFromTail();
    list1.delFromTail();
    cout << "del2:" << del2 << endl;
//    cout << flag << endl;
    //  cout << (node != NULL) << endl;
    cout << list1 << endl;



    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值