文章目录
一、线性表基础知识
表是由同类型的数据元素构成有序序列的线性结构。表中元素个数称为表的长度,没有元素时称为空表,表的第一个位置称为表头,最后一个位置称为表尾。
二、线性表的基本操作
一般来讲,有以下六种操作:
三、线性表的存储方式
线性表可以由抽象数据类型来表示,包括数据对象集和操作集。线性表有两种实现方法,第一种为数组(顺序存储),第二种为链表(链式存储)。
补充知识 单链表,双链表,数组的区别
1、线性表的顺序存储
需要两个元素,数组长度和指针(指示元素位置);
定义: 顺序存储就是用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。
特点: 逻辑上相邻的数据元素,物理上也是相邻的。
缺点: 不便于插入和删除操作(因为插入删除会引起大量数据的移动),存储密度高,需要预先分配足够应用的存储空间(必须事先知道元素的个数),不然可能会造成存储空间的浪费。
注意,线性表顺序存储时进行插入操作的时候,首先需要从后往前依次向后挪一个位置出来,然后进行插入。相反,进行删除操作的时候,需要先进行删除工作,然后从前往后依次往前挪一个位置。
2、线性表的链式存储
定义: 链式存储通过链建立起数据元素之间的逻辑关系,这种存储结构的线性表称为链式表,存储链表就是存储链表中的一个节点的地址,因此需要定义一个节点类型。。
特点: 不要求逻辑上相邻的数据元素,在物理上也是相邻的。便于插入和删除操作
优点: 不需要事先准备存储空间,需要时动态申请空间元素分散存储在内存中,用指针记住有关系的元素的存储地址
链表分类: 单链表,双链表,循环链表
下面一一介绍单链表,双链表,循环链表。
1)单链表相关操作及c++代码实现
单链表需要定义一个节点类型,每个节点有两部分:一是保持当前节点的数据,二是下一个节点的存储地址。
单链表插入操作
//先把p后的节点地址放在temp中,再把temp的地址放在p中
struct linkRec
{
datatype data;
linkRec *next;
}
tmp = new LinkRec; // 创建一个新节点
tmp->data = x; // 把x放入新节点的数据成员中
tmp->next = p->next; // 把新节点和p的下一成员相连
p->next = tmp; //把p和新节点连接起来
单链表删除操作
delPtr=p->next;
p->next=delPtr->next;
delete delPtr;
单链表头节点操作
引入头节点是为了避免在处理头节点与之后其他节点操作不一致的问题。建立头节点步骤, 1申请空间,2设为头节点。头节点指向链表在内存的首地址。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
//定义头指针
linkRec *head;
单链表的相关操作总结
//头文件
#pragma once
#include "pch.h"
#include <iostream>
using namespace std;
struct lianbiaoshengming
{
int data;
lianbiaoshengming *next;
};
class Lianbiaohanshu
{
public:
/*删除链表中某一节点函数*/
void delete_lianbiao()
{
cout << "请输入要删除的位置:" << endl;
int index;
cin >> index;
cout << endl;
p = head->next;
temp = new lianbiaoshengming;
for (int i = 0; i < index - 1; i++)
{
p = p->next;
}
temp= p->next;
p->next = temp->next;
cout << "第" << index << "位置的数据删除成功!" << endl;
};
/*在链表中插入某一节点函数*/
void insert_lianbiao()
{
cout << "请输入要插入的数字,换行输入的位置:" << endl;
int y,index;
cin >> y;
cout << endl;
cin >> index;
cout << endl;
temp = new lianbiaoshengming;
p