C++实现顺序表和单链表

创建文件命名为sqlist.h

#ifndef SQLIST_H
#define SQLIST_H

typedef int ElemType;

class SqList
{
public:
    SqList();                             // 无参构造函数,建立空的顺序表
    SqList(ElemType array[], int len);    // 有参构造函数,构建len个数据元素的顺序表

    ~SqList();                            // 析构函数

    ElemType Get(int index);              // 按位置查找
    int Find(ElemType x);                 // 按值查找
    bool Insert(int index, ElemType x);   // 插入操作
    bool Delete(int index);               // 删除操作
    void PrintList();                     // 打印顺序表

private:
    ElemType *elem;                       // 存储空间基址
    int length;                           // 当前长度
    int maxLen;                           // 存储空间的大小,根据第一次构造确定
};

/*
 * 单链表
 * 采用尾插法
 */

struct Node
{
    ElemType data;
    Node *next;
};

class LinkList
{
public:
    LinkList();                             // 无参构造函数,建立空的单链表
    LinkList(ElemType array[], int len);    // 有参构造函数,构建含有len个Node节点的链表

    ~LinkList();                            // 析构函数

    ElemType Get(int index);                // 按位置查找
    int Find(ElemType x);                   // 按值查找
    bool Insert(int index, ElemType x);     // 插入操作
    bool Delete(int index);                 // 删除操作
    void PrintList();                       // 打印链表

private:
    Node *head;    // 链表表头
    int length;    // 链表节点个数
};

#endif // SQLIST_H

创建第二个文件命名为sqlist.cpp

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

using namespace std;

SqList::SqList()
{
    elem = NULL;
    length = 0;
    maxLen = 0;
}

SqList::SqList(ElemType array[], int len)
{
    elem = new ElemType[len];
    maxLen = len;

    for (int i = 0; i < len; i++)
    {
        elem[i] = array[i];
    }
    length = len;
}

SqList::~SqList()
{
    if (maxLen > 0)
    {
        delete[] elem;
    }
}

ElemType SqList::Get(int index)
{
    if (index < 1 || index > length)
    {
        cout << "list do not have the " << index << "elem" << endl;
        return index;
    }

    return elem[index - 1];
}

int SqList::Find(ElemType x)
{
    for (int i = 0; i < length; i++)
    {
        if (elem[i] == x)
        {
            return (i + 1);
        }
    }
    cout << "list do not have" << x << "elem" << endl;
    return x;
}

bool SqList::Insert(int index, ElemType x)
{
    if (length >= maxLen)
    {
        cout << "overflow" << endl;
        return false;
    }
    if (index < 1 || index > length + 1)
    {
        cout << "Improper insertion" << endl;
        return false;
    }

    for (int i = length; i >= index; i--)
    {
        elem[i] = elem[i - 1];
    }
    elem[index - 1] = x;
    length++;

    return true;
}

bool SqList::Delete(int index)
{
    if (length == 0)
    {
        cout << "list is empty" << endl;
        return false;
    }

    if (index < 1 || index > length)
    {
        cout << "Improper deletion" << endl;
        return false;
    }

    for (int i = index; i < length; i++)
    {
        elem[i - 1] = elem[i];
    }
    length--;
    return true;
}

void SqList::PrintList()
{
    cout << "the list data:" << endl;
    for (int i = 0; i < length; i++)
    {
        cout << elem[i] << ",";
    }
    cout << endl << endl;
}


/*********************************** 单链表 ***************************/
LinkList::LinkList()
{
    head = NULL;
    length = 0;
}

LinkList::LinkList(ElemType array[], int len)
{
    Node* tail;

    head = new Node;
    head->data = array[0];
    head->next = NULL;
    tail = head;

    for (int i = 1; i < len; ++i)
    {
        Node *temp = new Node;
        temp->data = array[i];
        temp->next = NULL;
        tail->next = temp;
        tail = temp;
    }
    length = len;
}

LinkList::~LinkList()
{
    if (length > 0)
    {
        Node* temp;
        while (head != NULL)
        {
            temp = head;
            head = head->next;
            delete temp;
        }
    }
}

ElemType LinkList::Get(int index)
{
    if (index < 1 || index > length)
    {
        cout << "list do not have the " << index << "Node" << endl;
        return index;
    }
    Node* p = head;
    for (int i = 0; i < (index - 1); i++)
    {
        p = p->next;
    }
    return p->data;
}

int LinkList::Find(ElemType x)
{
    Node*p = head;
    int count = 1;
    while (p != NULL)
    {
        if (p->data == x)
        {
            return count;
        }
        count++;
        p = p->next;
    }
    cout << "list not Node have " << x << "data" << endl;
    return x;
}

bool LinkList::Insert(int index, ElemType x)
{
    if (index < 1 || index > length + 1)
    {
        cout << "Improper insertion" << endl;
        return false;
    }

    Node* temp = new Node;
    temp->data = x;
    temp->next = NULL;

    if (index == 1)
    {
        temp->next = head;
        head->next = temp;
        length++;
        return true;
    }

    Node* p = head;
    for (int i = 2; i < index; i++)
    {
        p = p->next;
    }
    temp->next = p->next;
    p->next = temp;
    length++;
    return true;
}

bool LinkList::Delete(int index)
{
    if (index < 1 || index > length)
    {
        cout << "Improper deletion" << endl;
        return false;
    }

    Node* p = head;

    if (1 == index)
    {
        head = head->next;
        delete p;
        length--;
        return true;
    }

    Node* pre = p;
    for (int i = 1; i < index; i++)
    {
        pre = p;
        p = p->next;
    }
    pre->next= p->next;
    delete p;
    length--;
    return true;
}

void LinkList::PrintList()
{
    cout << "the list data:" << endl;
    Node* p = head;
    while (p != NULL)
    {
        cout << p->data << ",";
        p = p->next;
    }
    cout << endl << endl;
}

下面是主函数调用上面的

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

using namespace std;

int main(int argc, char *argv[])
{
    /*********** 顺序表开始*******************/
    ElemType data[10] = {13, 3, 4, 7, 9, 55, 67, 23, 9, 33};
    SqList sqlist(data, 10);

    sqlist.PrintList();

    ElemType n = sqlist.Get(5);               // 查找第五个元素的值
    cout << "list the five elem is " << n << endl << endl;
    int index = sqlist.Find(23);              // 查找23在list的位置
    cout << "23 the index is " << index << endl << endl;

    sqlist.Delete(7);       // 删除第7个元素
    sqlist.PrintList();

    sqlist.Delete(3);       // 删除第3个元素
    sqlist.PrintList();

    sqlist.Insert(3, 5);    // 将5插入到第三个位置
    sqlist.PrintList();

    sqlist.Insert(7, 88);   // 将88插入到第7个位置
    sqlist.PrintList();
    /*********** 顺序表结束*******************/

    /*********** 链表开始*******************/
    cout << "*******************************************************" << endl << endl;
    ElemType linkdata[10] = {99, 33, 44, 77, 89, 55, 67, 51, 91, 33};
    LinkList linklist(linkdata, 10);
    linklist.PrintList();

    ElemType num = linklist.Get(5);                           // 查找第五个元素的值
    cout << "list the five node is " << num << endl << endl;
    int linkNum = linklist.Find(55);                            // 查找55在list的位置
    cout << "55 the index is " << linkNum << endl << endl;

    linklist.Delete(7);       // 删除第7个元素
    linklist.PrintList();

    linklist.Delete(3);       // 删除第3个元素
    linklist.PrintList();

    linklist.Insert(3, 5);    // 将5插入到第三个位置
    linklist.PrintList();

    linklist.Insert(7, 88);   // 将88插入到第7个位置
    linklist.PrintList();

    /*********** 链表结束*******************/
    getchar();
    return 0;
}

底下是运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值