目录
1.单链表简介
2.单链表的初始化
3.单链表的删除,插入,和输出。
4.程序运行结果。
1.单链表简介
单链表分为两种,一种叫做顺序表另外一种叫做链式表,它们的不同之处在于顺序表示按照顺序映射的方式储存的,数组就是典型的顺序表。这种表的特点是栈储存,空间申请过程比较简单,但是这种链表在进行插入,删除登操作时往往具有很大的空间复杂度以及时间复杂度,就举个例子说:假如你要要往一个顺序储存的链表里插入一个元素那么你就要将这个元素后面的所有元素都向后移动一个位置才能为要插入的元素腾出空间来,假如这个链表很长的话,程序的效率显然会变得非常慢,此外栈储存的的空间是有限的,当你申请的的空间过于庞大时往往就会出bug,这就是所谓的overflow。
链式表是一种基于堆储存的链表,储存空间取决于你电脑的虚拟内存有多大,因此相对于顺序储存而言,这种链表更加适合用来储存大规模的数据,这种链表很大情况下解决了顺序表在插入删除操作中造成的程序效率过低的问题。此外该种链表的长度是动态的,也就是需要多少申请多少,大大减少了程序对于储存空间的需求。需要注意的是,因为是堆储存,这种链表在不用的时候要及时释放,否则机器的内存会有被占光的风险。
下面本篇博客主要介绍一下链式表的建立,调试与使用。
2.链式表的初始化
首先,我们要建立两个类,一个链表类,另一个是用来测试的类。说明一下,这个程序是面向对象的,对于学过面向对象编程的朋友可能会看得明白一点。
首先打开vs2017,新建一个C++空项目,再敲“ctrl+shift+a”跳出如下窗口,首先新建一个名为main.cpp的c++文件放主函数,再建立两个类一个叫做Text,用做测试另外一个叫做LinearLinkedListe也就是我们接下来要写的链式链表类。
这些做好后打开视图->解决方案管理器看到如下的目录结构就没有错啦。
接下来首先就要写LinearLinkedList.h文件对LinearLinkedList类做各种声明
代码如下
#pragma once
#include<iostream>
typedef struct Node{
int data;
Node* next;
}LinkNode,*linkedList;
class LinearLinkedList
{
public:
int Length=0;
LinkNode Head;
linkedList head = &Head;
LinearLinkedList();
void InitLinkedList();
void InitLinkedList(int a[],int n);
void InsertLinkedList(int n,int Da);
void DisplayLinkedList();
void DeleteLinkedList(int n);
int FindLinkList(int n);
~LinearLinkedList();
};
typedef struct Node{
int data;
Node* next;
}LinkNode,*linkedList;
这个结构体对节点进行定义,data用来储存节点的数据,指针类型next用来储存下一个节点的地址,typedef分别定义了LinkNode,*linkedList;LinkNode 是Node的一个别名,linklist 是Node的一个指针类型。
public里边声明了对于指针进行各种操作的函数具体的在函数定义部分会进行详细的介绍。
特别要说明的是linkNode Head;的作用是给 head的定义提供一个地址,否则head就是一个野指针,操作一个野指针常常会把电脑玩炸。
下面就要写LinearLinkedList类的实现文件LinearLinkedList.cpp了,在解决方案管理器的目录中双击该文件即可打开该文件。
首先要写单链表的初始化函数代码如下
void LinearLinkedList::InitLinkedList()
{
head->next = nullptr;
linkedList position,L ;
L = head;
char response='y';
printf("Now!!!,you can input the data.\n");
printf("If you want to input data again,please clock Y or y\n");
while (response == 'y' || response == 'Y')
{
position = (LinkNode*)malloc(sizeof(linkedList));
position->next = L->next;
L->next = position;
printf("data%d =", Length);
scanf_s("%d", &(position->data));
getchar();
Length++;
L = position;
printf("Do you want to input the data?\n");
response = getchar();
getchar();
}
}
void LinearLinkedList::InitLinkedList(int a[],int n)
{
head->next = nullptr;
linkedList position, L;
L = head;
Length = n;
for (int i = 0; i < n; i++)
{
position = (LinkNode*)malloc(sizeof(linkedList));
position->data = a[i];
position->next = L->next;
L = position;
}
}
这里以函数重载的方式定义了两个InitLinkedList()函数,第一个没有参数的主要用于使用者逐个输入各个数据,第二个主要用于以数组的方式初始化单链表。
两个初始化的方式原理都基本相同,position用来生成新的节点,L则是用来记录上一个节点的位置。具体的过程需要画图理解,这里就不多做说明。
3.单链表的删除,插入,和输出。
初始化单链表后就要写对于但单链表的各种操作函数啦。代码如下
void LinearLinkedList::InsertLinkedList(int n,int Da)
{
linkedList position,temp;
position = head->next;
temp= (LinkNode*)malloc(sizeof(linkedList));
temp->data = Da;
for (int i = 0; i < n-1; i++)
{
position = position->next;
}
temp->next = position->next;
position->next = temp;
Length++;
}
void LinearLinkedList::DeleteLinkedList(int n)
{
linkedList position=head->next;
linkedList temp;
for (int i=0; i < n - 1; i++)
{
position = position->next;
}
temp = position->next;
position->next = temp->next;
Length--;
}
void LinearLinkedList::DisplayLinkedList()
{
linkedList position = head->next;
for (int i = 0; i < Length; i++)
{
printf("%d ", position->data);
position = position->next;
}
}
int LinearLinkedList::FindLinkList(int n)
{
linkedList position = head->next;
for(int i=0;i<n;i++)
{
position=position->next;
}
return position->data;
}
void InsertLinkedList(int n,int Da);函数用来在第n个位置插入一个元素Da,原理是先用一个循环得到第n个节点的指针,将Da的值赋给temp->data,然后让temp->next=position->next,position->next=temp;就OK啦
void DisplayLinkedList();
void DeleteLinkedList(int n);
int FindLinkList(int n);
的原理也是差不多,只要画图,相信一定可以很轻松搞定的啦。
至此LinearLinkedList类已经创建好了,还记得先前创建的Text类吗?让我们在这个类里给LinearLinkedList做一个测试吧。
分别写好Text.h 和Text.cpp如图
#pragma once
#include"LinearLinkedList.h"
class Text
{
public:
Text();
void LinearLinkedListText();
~Text();
};
#include "Text.h"
Text::Text()
{
}
void Text::LinearLinkedListText()
{
const int N=7;
int b[N] = { 2,9,4,13,24,28,45 };
LinearLinkedList a;
a.InitLinkedList();
//a.InitLinkedList(b);
a.DisplayLinkedList();
printf("\n");
a.InsertLinkedList(3, 7);
a.DeleteLinkedList(3);
a.DisplayLinkedList();
getchar();
}
Text::~Text()
{
}
接下来在主函数里调用这个类
#include"Text.h"
int main()
{
Text a;
a.LinearLinkedListText();
return 0;
}
4.程序运行结果
大功告成,哈哈哈