① 二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出。
1、建立一个单链表,并从屏幕显示单链表元素列表。
2、从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置;如果不存在,给出相应提示。
3、在上述的单链表中的指定位置插入指定的元素
4、删除上述单链表中指定位置的元素。
源程序:头文件
#include<iostream.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;
void about(){ //版本信息
cout<<"单链表的操作"
}
void showmenu(){ //功能列表
cout<<endl <<" **********功能**********"<<endl
<<" * 1.输出单链表的全部数据*"<<endl
<<" * 2.查找链表元素 *"<<endl
<<" * 3.链表插入元素 *"<<endl
<<" * 4.链表删除元素 *"<<endl
<<" * 5.结束 *"<<endl
<<" ************************"<<endl
<<"请输入所需功能: ";
}
//*******查看输入的全部数据*********
void PrintList(LinkList L){
LinkList p;
cout<<endl<<"你输入的数据为: ";
p=L->next; //从头结点开始扫描
while(p){ //顺指针向后扫描,直到p->next为NULL或i=j为止
cout<<p->data;
p=p->next; }
cout<<endl; }
//逆序输入 n 个数据元素,建立带头结点的单链表
void CreateList_L(LinkList &L, int n) {
int i;
LinkList p;
L = new LNode;
L->next = NULL; // 先建立一个带头结点的单链表
cout<<"逆序输入 n 个数据元素,建立带头结点的单链表"<<endl;
for (i = n; i > 0; --i) {
p = new LNode;
cin>>p->data; // 输入元素值
p->next = L->next; L->next = p; // 插入
}
}
// L是带头结点的链表的头指针,以 e 返回第 i 个元素
Status GetElem_L(LinkList L, int i, ElemType &e) {
int j;
LinkList p;
p = L->next; j = 1; // p指向第一个结点,j为计数器
while (p && j<i) { p = p->next; ++j; } // 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空
if ( !p || j>i )
return ERROR; // 第 i 个元素不存在
e = p->data; // 取得第 i 个元素
return OK;
}
// 本算法在链表中第i 个结点之前插入新的元素 e
Status ListInsert_L(LinkList L, int i, ElemType e) {
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR; // i 大于表长或者小于1
s = new LNode; // 生成新结点
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}
Status ListDelete_L(LinkList L, int i, ElemType &e)
{LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 寻找第 i 个结点,并令 p 指向其前趋
if (!(p->next) || j > i-1)
return ERROR; // 删除位置不合理
q = p->next; p->next = q->next; // 删除并释放结点
e = q->data; free(q);
return OK;
}
#include"LinkList.h"
void main()
{LinkList L;
int n,choice,i;
ElemType e;
about();
cout<<"请输入链表中元素的个数";
cin>>n;
CreateList_L(L, n);
showmenu(); //功能列表
cin>>choice;
while(choice!=5)
{ //输入时候退出程序
switch(choice){
case 1:PrintList(L);break; //1.查看输入的全部数据
case 2:{
cout<<"输入你要查找的元素的位置: ";
cin>>i;GetElem_L(L, i, e);
cout<<"第"<<i<<"个元素的值是"<<e<<endl;
break;} //2.查找链表元素
case 3:
{cout<<"请输入你要插入元素的位置i: ";
cin>>i;
cout<<endl<<"请输入你要插入元素的值: ";
cin>>e;
ListInsert_L(L, i,e);
break;} //3.链表插入元素
case 4:
{cout<<"请输入你要删除元素的位置";
cin>>i;
ListDelete_L(L, i, e) ;
break;} //4.链表删除元素
default:cout<<"输入错误,请输入-5,输入重显示功能表^_^ "<<endl;
}
cout<<endl<<"输入功能序号:";
cin>>choice;
}
}
② 数据结构的链式存储中之中是用于表示数据间的关系这句话对吗
链式存储结构中每个结点除了包含信息域之外,还至少包含 一个指针域。链式存储结构是用指针来体现数据元素之间的逻辑关系的。利用这种结构,各个数据元素的存储单元不再要求是连续的,即可以把逻辑上相邻的两个元素存放在物理上不相邻的存储单元中,还可以在线性编址的存储器中表示非线性关系的结点。
链式存储结构的主要特点为:
结点中除包含保存数据元素的自身信息的信息域外,还有表示数据元素之间的链接信息的指针域,因此比顺序存储结构的存储密度低,存储空间的利用率也较低。
逻辑上相邻的数据元素在物理上不一定相邻,可用于存储线性表、树、图等多种逻辑结构。
插入、删除操作比较灵活,不必移动数据元素,只要改变结点中的指针域的值即可。
链式结构是一种数据结构,学名链式存储结构,又叫链接存储结构。使用对象引用变量来创建对象间的链接。
它不要求逻辑上相邻的元素在物理位置上也相邻。因此它没有顺序存储结构所具有的弱点,同时也失去了顺序表可随机存取的优点。
其特点主要表现为:
1、比顺序存储结构的存储密度小;
2、插入、删除灵活,结点可以被插入到链表的任何位置,首、中、末都可以,而且不必要移动结点中的指针;
3、链表的大小可以按需伸缩,是一种动态存储结构,其实现的集合在增、删方面性能更高;
4、查找结点时的效率就相对数组较低,只能从第一个结点开始顺着链表逐个查找(这是他的缺点)。
高清播放机,图片大全,点击查看详情!
精选推荐
广告
数据结构篇——链式存储
3483阅读·0评论·0点赞
2019年2月18日
数据库二级复习笔记(1)选择题
1593阅读·0评论·1点赞
2022年3月15日
数据结构—栈---链式存储结构
115阅读·0评论·1点赞
2022年9月20日
数据结构之顺序存储与链式存储
6666阅读·0评论·10点赞
2020年11月25日
数据结构-第二章(5)-链式存储结构
1932阅读·4评论·3点赞
2021年11月26日
(数据结构)静态链表——概念、插入与删除(程序)、优缺点
320阅读·0评论·0点赞
2021年8月13日
高清播放机,图片大全,点击查看详情!
精选推荐
广告
链式存储结构的特点
1.3W阅读·1评论·2点赞
2017年10月31日
数据结构的链式存储结构
3673阅读·1评论·2点赞
2014年3月10日
数据结构——>链式存储结构
4
③ 线性表顺序存储结构和链式存储结构的定义,以及各自的有缺点,分别适合于哪些应用
定义
顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素。由于表中各个元素具有相同的属性,所以占用的存储空间相同。
线性表按链式存储时,每个数据元素 (结点)的存储包括数据区和指针区两个部分。数据区存放结点本身的数据,指针区存放其后继元素的地址只要知道该线性表的起始地址表中的各个元素就可通过其间的链接关系逐步找到
优缺点
顺序存储需要开辟一个定长的空间,读写速度快,缺点不可扩充容量(如果要扩充需要开辟一个新的足够大的空间把原来的数据重写进去)
链式存储无需担心容量问题,读写速度相对慢些,由于要存储下一个数据的地址所以需要的存储空间比顺序存储大。
④ 线性表的链式存储结构定义及基本操作
是这个效果吗
⑤ 在数据结构中,线性表常用的存储表示方式有哪两种定义是什么
顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素。由于表中各个元素具有相同的属性,所以占用的存储空间相同。因此,在内存中可以通过地址计算直接存取线性表中的任一元素。这种结构的特点是逻辑上相邻的元素物理上也相邻。用顺序结构存储的线性表称作顺序表。 线性表按链式存储时,每个数据元素 (结点)的存储包括数据区和指针区两个部分。数据区存放结点本身的数据,指针区存放其后继元素的地址 (没有后继元素时设置为空字符(Null).。只要知道该线性表的起始地址 (记录在头指针中),表中的各个元素就可通过其间的链接关系逐步找到
⑥ 链式存储队列的数据结构(逻辑结构+存储结构)分析、链式存储队列的基本c语言结构体分析与定义
链式队列
链式存储结构的队列称作链式队列。
链式队列的队头指针指在队列的当前队头结点位置,队尾指针指在队列的当前队尾结点位置。不带头结点的链式队列时可直接删除队头指针所指的结点。
链式队列中结点的结构体可定义如下:
typedef struct qnode
{
DataType datal;
Struct qnode *next;
}LQNode;
为了方便参数调用,通常把链式队列的队头指针front和队尾指针rear也定义为如下的结构体类型LQueue:
typedef struct
{
LQNode *front;
LQNode *rear;
}LQueue;
链式队列操作的实现
(1) 初始化QueueInitiate(LQueue *Q)
void QueueInitiate(LQueue *Q)
{
Q->rear=NULL;
Q->front=NULL;
}
(2)非空否QueueNotEmpty(LQueue Q)
int QueueNotEmpty(LQueue Q)
/*判断链式队列Q非空否,非空返回1,否则返回0*/
{
if(Q.front==NULL)return 0;
else return 1;
}
(3)入队列QueueAppend(LQueue *Q,DataType x)
int QueueAppend(LQueue *Q,DataType x)
/*把数据元素x插入链式队列Q队列的队尾,入队列成功返回1,否则返回0*/
{
LQNode *p;
if((p=(LQNode*)malloc(sizeof(LQNode)))==NULL)
{
printf(“内存不足无法插入!\n);
return 0;
}
p->data=x;
p->next=NULL;
if(Q->rear!=NULL)Q->rear->next=p;
Q->rear=p;
if(Q->front==NULL)Q->front=p;
return 1;
}
(4)出队列QueueDelete(LQueue *Q,DataType *d)
int QueueDelete(LQueue *Q,DataType *d)
/*删除链式队列Q的队头数据元素值到d,出队列成功返回1,否则返回0*/
{
LQNode *p;
if(Q->front==NULL)
{
printf(“队列已空无数据元素出队列!\n”);
return 0;
}
else
{
*d=Q->front->data;
p=Q->front;
Q->front=Q->front->next;
if(Q->front==NULL)Q->rear=NULL;
free(p);
return 1;
}
}
(5)取队头数据元素QueueGet(LQueue *Q,DataType *d)
int QueueGet(LQueue *Q,DataType *d)
/*取链式队列Q的当前队头数据元素值到d,成功返回1,否则返回0*/
{
if(Q.front==NULL)
{
printf(“队列已空无数据元素出队列!\n);
return 0;
}
else
{
*d=Q.front->data;
return 1;
}
}
(6)撤销动态申请空间Destory(LQueue *head)
int Destory(LQueue *head)
{
LQNode *p,*p1;
p=Q.front;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
帮你转的,我觉得他描述的很清楚。希望对你有帮助。
⑦ 数据结构基本概念
数据结构概念包含三方面:数据的逻辑结构、数据的存储结构、对数据的操作
一、数据的逻辑结构
1、数据的逻辑结构是指数据元素之间的逻辑关系,用一个数据元素的集合和定义在此集合上的若干关系表示。
2、数据结构分为三种:线性结构、树结构、图
其中树和图是非线性结构。
(1)线性结构:是具有线性关系的数据结构,线性表的元素是有序数列,每个元素(除了头和尾)有且仅有一个前驱和后继。
(2)树结构:数据元素之间具有层次关系的一种非线性结构,树种数据元素通常称为结点。树结构的层次关系是指---->根结点没有前驱结点,除了根以外的其他结点有且仅有一个父母结点,所有结点可有多个或零个后继结点,或称孩子结点。
(3)图:每个数据元素可有多个前驱元素和多个后继元素。
3、数据元素及其关系在计算机中的存储表示或实现称为“数据的存储结构”,也称物理结构
二、数据的存储结构
1、数据的逻辑结构从逻辑关系的角度观察数据,它与数据的存储无关,独立于计算机,而数据的存储结构是逻辑结构在计算机内存中的实现,依赖于计算机。
2、数据的存储结构基本形式有两种:顺序存储结构、链式存储结构
(通常数组实现顺序存储结构、链表实现链式存储结构)
(1)顺序存储结构:使用一租连续的内存单元一次存放数据元素,数据元素在内存中的物理存储顺序与他们的逻辑顺序相同,即每个元素与其前驱元素以及后继元素的存储位置相邻。
(2)链式存储结构:使用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻,数据元素之间的关系需要采用附加信息特别指定。通常像链表那样,采用指针变量来记录前驱和后继元素的地址,c语言采用指针,Java采用引用。
三、对数据的操作
1、每中数据结构都需要一组对其元素实现特定功能的操作:
比如:初始化、判空、存、取、插入、删除、排序等等操作。
四、数据类型与抽象数据类型
1、数据类型
类型是具有相同意义的一组值的集合,数据类型是指一个类型和定义在这个类型上的操作集合,数据类型定义了数据的性质,取值范围以及对数据所能进行的各种操作。
(Java的基本数据类型包括:整数类型,浮点类型等等)
2、抽象数据类型
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
比如复数的抽象数据类型:
3、数据抽象
是指“定义”和“实现”相分离,类似与接口的定义与实现。
四、数据结构基本区别
⑧ 链式存储结构属于线性结构还是非线性的存储结构
链表是线性表的链式存储结构
线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素与其直接后继数据元素
之间的逻辑关系,对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个“结点”,表示线性表中一个数据元素
。
链表(Linked
list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。
链表通常由一连串节点组成,每个节点包含任意的实例数据(data
fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。
链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。