一个简单的int型C++单链表的实现

IntSLList.h

//************************  intSLList.h  **************************
//           singly-linked list class to store integers

#ifndef INT_LINKED_LIST
#define INT_LINKED_LIST

class IntSLLNode {
public:
    IntSLLNode() {
        next = 0;
    }
    IntSLLNode(int el, IntSLLNode *ptr = 0) {
        info = el; next = ptr;
    }
    int info;
    IntSLLNode *next;
};

class IntSLList {
public:
    IntSLList() {
        head = tail = 0;
    }
    ~IntSLList();
    int isEmpty() {
        return head == 0;
    }
    void addToHead(int);
    void addToTail(int);
    int  deleteFromHead(); // delete the head and return its info;
    int  deleteFromTail(); // delete the tail and return its info;
    void deleteNode(int);
    bool isInList(int) const;
    void printAll() const;
private:
    IntSLLNode *head, *tail;
};

#endif

IntSLList.cpp

//************************  intSLList.cpp  **************************

#include <iostream>
#include "intSLList.h"

using namespace std;

IntSLList::~IntSLList() {
    for (IntSLLNode *p; !isEmpty();) {
        p = head->next;
        delete head;
        head = p;
    }
}

void IntSLList::addToHead(int el) {
    head = new IntSLLNode(el, head);
    if (tail == 0)
        tail = head;
}

void IntSLList::addToTail(int el) {
    if (tail != 0) {      // if list not empty;
        tail->next = new IntSLLNode(el);
        tail = tail->next;
    }
    else head = tail = new IntSLLNode(el);
}

int IntSLList::deleteFromHead() {
    int el = head->info;
    IntSLLNode *tmp = head;
    if (head == tail)     // if only one node on the list;
        head = tail = 0;
    else head = head->next;
    delete tmp;
    return el;
}

int IntSLList::deleteFromTail() {
    int el = tail->info;
    if (head == tail) {   // if only one node on the list;
        delete head;
        head = tail = 0;
    }
    else {                // if more than one node in the list,
        IntSLLNode *tmp; // find the predecessor of tail;
        for (tmp = head; tmp->next != tail; tmp = tmp->next);
        delete tail;
        tail = tmp;      // the predecessor of tail becomes tail;
        tail->next = 0;
    }
    return el;
}

void IntSLList::deleteNode(int el) {
    if (head != 0)                     // if non-empty list;
    if (head == tail && el == head->info) { // if only one
        delete head;                       // node on the list;
        head = tail = 0;
    }
    else if (el == head->info) {  // if more than one node on the list
        IntSLLNode *tmp = head;
        head = head->next;
        delete tmp;              // and old head is deleted;
    }
    else {                        // if more than one node in the list
        IntSLLNode *pred, *tmp;
        for (pred = head, tmp = head->next; // and a non-head node
            tmp != 0 && !(tmp->info == el);// is deleted;
            pred = pred->next, tmp = tmp->next);
        if (tmp != 0) {
            pred->next = tmp->next;
            if (tmp == tail)
                tail = pred;
            delete tmp;
        }
    }
}

bool IntSLList::isInList(int el) const {
    IntSLLNode *tmp;
    for (tmp = head; tmp != 0 && !(tmp->info == el); tmp = tmp->next);
    return tmp != 0;
}

void IntSLList::printAll() const {
    for (IntSLLNode *tmp = head; tmp != 0; tmp = tmp->next)
        cout << tmp->info << " ";
    cout << endl;
}

main.cpp

#include <iostream>
#include "intSLList.h"

using namespace std;

int main(int argc, char* argv[])
{
    int end;

    IntSLList *list = new IntSLList();

    list->addToHead(100);
    list->addToHead(200);
    list->addToHead(300);
    list->addToHead(400);
    list->addToHead(500);
    list->addToHead(999);

    list->printAll();

    delete list;

    cout << "-----------------------------------------------------------" << endl;

    IntSLList *list2 = new IntSLList();

    list2->addToTail(100);
    list2->addToTail(200);
    list2->addToTail(300);
    list2->addToTail(400);
    list2->addToTail(500);
    list2->addToTail(999);

    list2->printAll();

    delete list2;

    cout << "Press Any Key to Continue ... " << endl;
    cin >> end;

    return 0;
}

运行结果:

999 500 400 300 200 100
-----------------------------------------------------------
100 200 300 400 500 999
Press Any Key to Continue ...

时间: 2024-11-06 07:06:15

一个简单的int型C++单链表的实现的相关文章

C++ Daily 《4》----一个简单的 int to string 的方法

经常会在项目中用到 int to string, 之前一般用C语言的 sprintf, 发现C++ 中的 ostringstream 可以轻松完成这个任务. #include <iostream> #include <string> #include <sstream> using namespace std; int main(void) { ostringstream num; num << 123; string str = num.str(); co

栈的简单实现(2)-单链表实现

引言 栈(stack)是一种被广泛使用的线性数据结构,它只允许在表的一端进行插入或删除操作,因而栈也可以被称作为操作受限的线性表 .在栈中,允许插入或删除的一端称作栈顶(top)不允许插入和删除的另一端称作栈底(bottom); 示意图如下: 此文借助单链表简单地实现栈及其基本操作. 代码如下: typedef struct stack{ int data; struct stack* next; }ListStack; 注:这里假设栈中储存的是整型 (int) 的数据 基本操作 1.栈的初始化

用最简单的方式学Python单链表

Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式截然不同 什么是单链表 单链表 最简单的形式就是由多个节点的集合共同构成一个线性序列.每个节点存储一个对象的引用,这个引用指向序列中的一个元素,即存储指向列表的下一个节点. 其实,上面的术语用生活中的大白话来解释,就是我们现在有三个人--我.你.他.当我用手指指向你,你用手指指向他,这样就形成了一个

一个简单且完善的表单验证(毕老师的)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title&

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java

数据结构-编程实现一个单链表节点的删除

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()

数据结构-编程实现一个单链表节点的插入

1:向链表中某个位置(第pos个节点)之后插入节点,这里分别插入到链表首部.插入到链表中间,以及链表尾端3个位置.代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;/

数据结构-编程实现一个单链表的测长

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()//创建单链表 { int i = 0;//链表中数据的个数 node *head, *p,

C实现通用数据结构--单链表

单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言中使用malloc),切记这些元素通常实际上都是分散在内存空间的 本文地址:http://www.cnblogs.com/archimedes/p/c-datastruct-linklist.html,转载请注明源地址. 单链表的接口定义: 1.list_init void list_init(Li