线性表-线性结构

用C++实现线性表线性结构

List.h

#pragma once
#include<iostream>
#include<vector>

typedef int ElemType;
#define  MaxSize 30

struct List {
    ElemType * data; //定义数据
    int len; //给定长度
    int size; //定义初始化大小
};

class sqList {
public:
    List L;
    sqList();
    ~sqList();
public:
    void InitList(List &L); //初始化一个线性表
    //清空线性表                     
    void ClearList(List &L);
    //销毁一个线性表
    void DestroyList(List &L);
    //判断线性表是不是为空
    bool isListEmpty(List L);
    //返回线性表的长度
    int ListLength(List L);
    //返回线性表上指定位置的元素,通过e返回
    int GetElem(List L, int i, int &e);
    //判断一个元素是不是列表中的某一个值
    bool isElemList(List L, int e, std::vector<int>& i);
    //返回非第一个元素的前一个元素值
    bool PriorElem(List L, int cur_e, std::vector<int> &pri_e);
    //返回非最后一个元素的后一个元素值
    bool NextElem(List L, int cur_e, std::vector<int> &next_e);
    //指定的位置插入某个元素
    bool ListInsert(List &L, int i, int e);
    //指定位置删除某个元素
    bool ListDelete(List &L, int i);
    //连接两个线性表,出去重复的部分
    void Connect_Two_List(List a, List b, List &c);
    //打印线性表
    void printLst(List L);
};

List.cpp

#include"list.h"
#include <vector>

sqList::sqList(){
    InitList(L);
}

sqList::~sqList() {
    ClearList(L);
    DestroyList(L);
}


void sqList::InitList(List &L) {
    L.data = new ElemType[5];
    L.data[0] = 9;
    L.data[1] = 3;
    L.data[2] = 8;
    L.data[3] = 12;
    L.data[4] = 16;
    L.len = 5;
    L.size = 5;
}
void sqList::ClearList(List &L) {
    L.len = 0;
    delete[] L.data;
    L.data = NULL;
    L.data = new ElemType[L.size];
}
void sqList::DestroyList(List &L) {
    L.len = 0;
    L.data = 0;
    delete[] L.data;
    L.data = NULL;
}

bool sqList::isListEmpty(List L) {
    if (L.len != 0)
        return false;
    return true;
}

int sqList::ListLength(List L) {
    return L.len;
}


int sqList::GetElem(List L, int i, int &e) {
    if (i < 0 || i > L.len)
        return -1;
    e = L.data[i];
    return 0;
}

bool sqList::isElemList(List L, int e, std::vector<int>& i) {
    bool flag = isListEmpty(L);
    if (flag)
        return false;
    for (int k = 0; k < L.len; k++) {
        if (L.data[k] == e)
            i.push_back(k);
    }
    if (0 == i.size())
        return false;
    return true;
}

bool sqList::PriorElem(List L, int cur_e, std::vector<int> &pri_e) {
    std::vector<int> i;
    bool flag = isElemList(L, cur_e, i);
    if (flag) {
        for (int k = 0; k < i.size(); k++) {
            if (i[k] > 0 && i[k] <= L.len) //非第一个元素
                pri_e.push_back(L.data[i[k] - 1]);
        }
    }
    else
        return false;
    return true;
}

bool sqList::NextElem(List L, int cur_e, std::vector<int> &next_e) {
    std::vector<int> i;
    bool flag = isElemList(L, cur_e, i);
    if (flag) {
        for (int k = 0; k < i.size(); k++) {
            if (i[k] < L.len) //非最后元素
                next_e.push_back(L.data[i[k]]+1);
        }
    }
    else
        return false;
    return true;
}

bool sqList::ListInsert(List &L, int i, int e) {
    //插入的位置不合法
    if (i < 1 || i > L.len + 1)
        return false;
    int j = 0;
    //重新分配空间,因为插入的元素
    if (L.len == L.size) {
        //保存之前的内容
        ElemType *p = new ElemType[L.len];
        for (int j = 0; j < L.len;j++) {
            p[j] = L.data[j];
        }
        //扩大容量
        L.size += 1;
        delete[] L.data;
        //重新分配内存
        L.data = new ElemType[L.size];
        //L.len = L.size;
        //恢复之前的数据
        for (j = 0; j < L.len; j++) {
            L.data[j] = p[j];
        }
    }

    L.len++;
    for (int k = L.len; k > i-1; k--) {
        L.data[k] = L.data[k-1];
    }
    L.data[i-1] = e;
    L.len+=1;
    return true;
}

bool sqList::ListDelete(List &L, int i) {
    if (i < 1 || i > L.len)
        return false;
    for (int k = i-1; k < L.len; k++) {
        L.data[k] = L.data[k+1];
    }
    L.len--;
    return true;
}

//合并两个链表
/*
* 1.
*/
void sqList::Connect_Two_List(List a, List b, List &c) {
    //预处理链表C
    c.len = c.size = a.len + b.len;
    c.data = new ElemType[c.size];
    int i = 0;
    int j = 0;
    int k = 0;
    while (i <= a.len - 1 && j <= b.len - 1) {
        if (a.data[i] < b.data[j]) {
            c.data[k++] = a.data[i++];
        }
        else if (a.data[i] > b.data[j]) {
            c.data[k++] = b.data[j++];
        }
        else {
            c.data[k++] = a.data[i++];
            j++;
            --c.len;
        }
    }
    while (i <= a.len - 1)
    {
        c.data[k++] = a.data[i++];
    }
    while (j < b.len - 1)
    {
        c.data[k++] = b.data[j++];
    }
}
void sqList::printLst(List L) {
    if (L.len <= 0)
        return;
    for (int i = 0; i < L.len; i++)
        std::cout << L.data[i] << " ";
    std::cout << std::endl;
}

测试程序main.cpp

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

int main() {
    sqList sqL;
    //1、创建一个链表
    bool flag = sqL.isListEmpty(sqL.L);
    if (!flag)
        std::cout << "链表非空!" << std::endl;
    else
        return 0;
    //2、打印链表
    sqL.printLst(sqL.L);
    //3、获取链表中特定的元素
    int e;
    sqL.GetElem(sqL.L, 3, e);
    printf("%d\n", e);
    //4、获取链表长度
    int len = sqL.ListLength(sqL.L);
    printf("%d\n", len);
    //5、判断某一个元素是不是链表中的元素
    std::vector<int> elem;
    bool isElem = sqL.isElemList(sqL.L, 8, elem);
    if (isElem)
        std::cout << 8 << " is a elem in List, has " << elem.size() << " number"<< std::endl;
    //6、获取某一元素的前一个元素
    std::vector<int> pri_e;
    bool pElem = sqL.PriorElem(sqL.L, 8, pri_e);
    if (pElem)
    {
        for (int i = 0; i < pri_e.size(); i++) 
        {
            std::cout << pri_e[i] << " ";
        }
    }
    //7、获取某一个元素的后一个元素
    std::vector<int> next_e;
    bool nElem = sqL.NextElem(sqL.L, 8, next_e);
    if (nElem)
    {
        for (int i = 0; i < next_e.size(); i++)
        {
            std::cout << next_e[i] << " ";
        }
    }
    //8、线性表插入元素
    int inum = 100;
    sqL.ListInsert(sqL.L, 4, inum);
    sqL.printLst(sqL.L);
    //9、线性表删除元素
    sqL.ListDelete(sqL.L, 4);
    sqL.printLst(sqL.L);
    //10、链接两个线性表
    sqList a;
    a.ClearList(sqL.L);
    for (int i = 0; i < 6; i++)
        a.ListInsert(a.L, i, i*2);
    sqList c;
    sqL.Connect_Two_List(a.L, sqL.L, c.L);
    c.printLst(c.L);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容