一、数据结构的基础
1)链表
常见的定义
链表由一系列不必在内存相连的项组成。每个项包含数据域和指向该项的后继项的指针。ps:指针简单理解为地址,通过指针可以获取到地址的内存单元,使用指针来读取数据。C++标准规定,指针分为两类:
-
object pointer type:指向void或对象类型,表示对象在内存中的字节地址或空指针。
-
function pointer type:指代一个函数
回到正题:
链表出现的原因,也是链表对比数组的有点。链表优点:在插入和删除的操作上是线性,链表可以动态分配,不会浪费内存空间。
链表、指针是数据结构的基石。由于c/c++对指针的支持,天然使用c/c++来编写相关代码。在其他语言如java,c#,已经不使用指针。
链表如图所示:
在执行删除和插入操作时,可以通过修改指针来实现。
在学习指针的创建,插入,删除相关操作时,保留一个头指针是一种好的习惯。学习链表最好的办法是画图,画图最好记忆。
- 插入
插入的含义是让x插入在a2之后,即是修改a2的next指针,让它指向x,x的next指针指向a3:
- 让x的指针指向a3
- 让a2的指针指向x
- 删除与插入类似,不作说明,在具体代码中体现。
具体实现(c++版本)
实现平台:win7,vs2015
node.h
#pragma once
/*
* 链表类型声明
*/
struct Node
{
int Data;
Node* Next;
};
LinkList.h
#pragma once
#include "node.h"
/*
*链表操作类
*/
class LinkList
{
private:
Node *m_Head;
public:
LinkList();
~LinkList();
public:
bool CreateLinList(int arrays[],int length);
void Delete(int index);
bool Insert(int data, int index);
void Display();
private:
void initialize();
Node* find(int index);
};
LinkList.cpp
#include "stdafx.h"
#include "LinkList.h"
LinkList::LinkList()
{
}
LinkList::~LinkList()
{
}
/*
* 创建单链表
*/
bool LinkList::CreateLinList(int arrays[], int length)
{
if (NULL == m_Head)
{
initialize();
}
if (NULL == arrays || NULL == m_Head)
{
return false;
}
Node* p = m_Head;
for (size_t i = 0; i < length; i++)
{
Node* q = new Node();
if (NULL == q)
{
return false;
}
q->Data = arrays[i];
q->Next = NULL;
p->Next = q;
p = q;
}
return true;
}
/*
*删除指定位置的元素
*/
void LinkList::Delete(int index)
{
Node*p = find(index);
if (NULL == p)
{
return;
}
Node* q = p->Next;
p->Next = q->Next;
delete q;
}
/*
* 指定位置插入元素
*/
bool LinkList::Insert(int data, int index)
{
Node*p = find(index);
if (NULL == p)
{
return false;
}
Node* q = new Node();
if (NULL == q)
{
return false;
}
q->Data = data;
q->Next = p->Next;
p->Next = q;
return true;
}
void LinkList::Display()
{
if (NULL == m_Head)
{
return;
}
cout << "this LinkList is:" << endl;
Node* p = m_Head->Next;
while (NULL!=p)
{
cout << p->Data << "\t";
p = p->Next;
}
cout << endl;
}
Node* LinkList::find(int index)
{
if (index < 0)
{
return NULL;
}
Node *p = m_Head;
int i = 0;
while (i < index && p != NULL)
{
p = p->Next;
i++;
}
return p;
}
void LinkList::initialize()
{
m_Head = new Node();
m_Head->Next = NULL;
}
测试类
// part1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "LinkList.h"
void WaitUserPressAKey();
int main()
{
//LinkList
int arrs[] = { 1, 2, 3, 4, 5 };
LinkList *linkList = new LinkList();
bool repose=linkList->CreateLinList(arrs, sizeof(arrs) / sizeof(int));
if (!repose)
{
return 0;
}
linkList->Display();
linkList->Insert(12, 3);
linkList->Display();
linkList->Delete(3);
linkList->Display();
linkList->~LinkList();
WaitUserPressAKey();
return 0;
}
void WaitUserPressAKey()
{
cout << "press any key to exit!" << endl;
char input = 1;
cin >> input;
}