c++实现线性表链式存储结构(单链表)

至于链表的基础知识请自行补充,这里不作赘述

链式线性表的优点:插入和删除元素不需要移动其他元素,空间利用率高

缺点:查找以及查找较为麻烦

实现:

linkedList.h:

//
// Created by shuai on 19-1-20.
//

#ifndef INC_002_LINKEDLIST_H
#define INC_002_LINKEDLIST_H
/*
c++实现线性表的链式存储结构(单链表)
以int型数据为例,本次不采用模板
 写的较为简单,仅仅实现简单的功能
 本链表有头结点,但头结点不是链表的必要元素,头结点的数据域为空,指针域指向链表的第一个元素
链表的优缺点:
 在任意位置存取方便
 空间利用率较高等
 遍历较为麻烦
 */

#include "iostream"

using namespace std;
//template <class T>
struct Node{
    int data;
    Node * pNext;
};

class linkedList {
public:
    linkedList();  //无参构造函数,建立只有头结点的空链表
    linkedList(int a[], int n);  //有参构造函数,使用数组a建立单链表
    ~linkedList();  //析构函数
    int len(); //得到单链表的长度
    int getElem(int i); //得到第i个位置上的元素
    int locateElem(int elem); //查找elem的位置
    void listInsert(int i, int elem); //在第i个位置插入元素elem
    int listDelete(int i); //删除第i个位置的元素 并返回
    void showList();

private:
    Node * pFirst;
};


#endif //INC_002_LINKEDLIST_H

linkedList.cpp:

//
// Created by shuai on 19-1-20.
//

#include "linkedList.h"

linkedList::linkedList() {
    pFirst = new Node;  //空链表的头结点  指针域为空,数据域也为空
    pFirst->pNext = NULL;
    pFirst->data = NULL;
}

//尾插法
linkedList::linkedList(int *a, int n) {
    pFirst = new Node; //头结点
    pFirst->pNext = NULL;
    pFirst->data = NULL; //头结点的数据域为空
    Node * rear = pFirst; //尾结点,初始化
    for(int i = 0;i < n;i++){
        Node * s = new Node;
        s->data = a[i];
        rear->pNext = s; //将尾结点的指针指向新的尾结点
        rear = s; //s现在就是新的尾结点
    }
    rear->pNext = NULL; //尾结点的指针域为空
}

linkedList::~linkedList() {
    while (pFirst != NULL){
        Node *p = pFirst;
        //if(pFirst->pNext != NULL)
        pFirst = pFirst->pNext;
        delete p;
    }
}

//至于头插法 自个儿可以去写
//尾插法
void linkedList::listInsert(int i, int elem) {
    int cnt = 0;
    Node * p = pFirst; //讲p指向头指针
    while(p){
        if(cnt == i - 1){
            Node * s = new Node;
            s->data = elem;
            s->pNext = p->pNext;
            p->pNext = s;
        }
        p  = p->pNext;
        cnt++;
    }
}


int linkedList::getElem(int i) {
    int cnt = 0;
    Node * p = pFirst;
    while (p){
        if(cnt == i){
            return p->data;
        }
        p = p->pNext;
        cnt++;
    }
    return -1;
}

int linkedList::len() {
    int cnt = 0;
    Node * p = pFirst;
    while(p){
        if(p->pNext == NULL)
            return cnt;
        p = p->pNext;
        cnt++;
    }
    return cnt;
}

void linkedList::showList() {
    Node * p = pFirst->pNext;
    if(p == NULL){
        cout << "此链表为空" << endl;
        return;
    }
    while (p){
        cout << p->data << " ";
        p = p->pNext;
    }
    cout << endl;
}

int linkedList::locateElem(int elem) {
    Node * p = pFirst->pNext;
    int cnt = 1;
    while (p){
        if(p->data == elem)
            return cnt;
        p = p->pNext;
        cnt++;
    }
    cout << "此链表没有这个元素" << endl;
    return -1;
}

int linkedList::listDelete(int i) {
    int cnt = 1;
    Node * p = pFirst;
    while (p != NULL && cnt < i){
        p = p->pNext;
        cnt++;
    }
    Node * q = p->pNext;
    int x = q->data;
    p->pNext = q->pNext;
    delete q;
    return x;
}

main.cpp:

#include <iostream>
#include "linkedList.h"
using namespace std;
int main() {
    //std::cout << "Hello, World!" << std::endl;
    int a[] = {1,2,3,4,5,6,7,8,9};
    linkedList l1;
    linkedList l2(a, 9);
    //cout << sizeof(l1) << " " << sizeof(l2) << endl;
    cout << l1.len() << " " << l2.len() << endl;
    cout << l2.getElem(0) << endl;
    cout << int(NULL) << endl;
    l1.showList();
    l2.showList();
    l2.listInsert(4,20);
    l2.showList();
    cout << l2.listDelete(6) << endl;
    l2.showList();
    cout << l2.locateElem(20);
    return 0;
}

运行部分截图:

发布了27 篇原创文章 · 获赞 70 · 访问量 9418

猜你喜欢

转载自blog.csdn.net/qq_23905237/article/details/86583532
今日推荐