您的位置:首页 > 编程语言 > C语言/C++

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

2019-01-21 20:26 483 查看

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

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

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

实现:

linkedList.h:

[code]//
// 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:

[code]//
// 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:

[code]#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;
}

运行部分截图:

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: