至于链表的基础知识请自行补充,这里不作赘述
链式线性表的优点:插入和删除元素不需要移动其他元素,空间利用率高
缺点:查找以及查找较为麻烦
实现:
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;
}
运行部分截图: