‘壹’ 链式存储队列的数据结构(逻辑结构+存储结构)分析、链式存储队列的基本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);
}
}
帮你转的,我觉得他描述的很清楚。希望对你有帮助。
‘贰’ 单链表的存储密度是多少
单链表的存储密度是:
假设单链表数据元素本身的存储量为N,指针域所占的存储量为M,则存储密度为:N/(N+M)。
存储密度越大,空间利用率越高,显然顺序表的存储密度为1,如果单纯的从存储密度来讲,链表的这种存储方式是不经济的,基于此,如线性表的长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表作为存储结构。
单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素数据元素的映象指针指示后继元素存储位置。
元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示线性表称作线性链表(单链表),单链表是链式存取的结构。
‘叁’ 急求.......用链式存储结构定义一个单链表的数据结构程序...............
/*这个程序实现了链表的创建、插入、删除和输出等功能,是我数据结构上机实验做的,编译环境是VC++6.0*/
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}Lnode;
typedef Lnode *LinkList;
//初始化链表
Status InitList(LinkList &L)
{ Lnode *p;
p=(Lnode *)malloc(sizeof(Lnode));
if(p==NULL) return ERROR;
L=p;
L->next=NULL;
return OK;
}
//创建链表
Status CreatList(LinkList &L)
{ int i,len;
ElemType x;
LinkList p,q;
printf("input list length:");
scanf("%d",&len);
printf("\ninput list data:\n");
i=0; q=L;
while(i<len)
{ p=(Lnode *)malloc(sizeof(Lnode));
scanf("%d",&x);
p->data=x;
q->next=p;
q=p;
i++;
}
q->next=NULL;
return OK;
}
//获取链表长度
int ListLength(LinkList L)
{ int len=0;
LinkList p;
p=L->next;
while(p)
{ len++;
p=p->next;}
return (len);
}
//取链表中的元素
Status GetList(LinkList L,int i,ElemType &e)
{ int j;
LinkList p;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i)
{ p=p->next;
j++;}
if(j==i) {e=p->data; return OK;}
return ERROR;
}
//插入数据
Status InsertList(LinkList &L,int i,ElemType e)
{ int j;
LinkList p,q;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i-1)
{ p=p->next;
j++;}
if(j==i-1)
{ q=(Lnode *)malloc(sizeof(Lnode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;}
return ERROR;
}
//删除数据
Status DeleteList(LinkList &L,int i,ElemType &e)
{ int j;
LinkList p,q;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i-1)
{ p=p->next;
j++;}
if(p->next==NULL)
{ return ERROR;}
else
{ q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;}
}
//输出链表
void PrintList(LinkList L)
{
LinkList p;
p=L->next;
printf("链表中的元素为:");
while(p){
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
ElemType i,e;
LinkList L;
InitList(L);
CreatList(L);
printf("输入要取元素的位置:");
scanf("%d",&i);
GetList(L,i,e);
printf("第%d个位置的元素是:%d\n",i,e);
printf("输入要插入元素的位置及元素值:");
scanf("%d%d",&i,&e);
InsertList(L,i,e);
printf("已插入元素%d在第%d个位置!\n",e,i);
PrintList(L);
printf("输入要删除的位置:");
scanf("%d",&i);
DeleteList(L,i,e);
printf("已删除第%d个元素的位置%d!\n",i,e);
PrintList(L);
}
如果有不明白的可以问我,我QQ是975336234,最好是邮件的方式。
请采纳!
‘肆’ 单链表存储结构的C语言定义是具体是指什么
数据的存储方式有两种,顺序存储和链式存储,当然单链表也是链式存储中的一种,单链表存储结构的c语言定义应该是用c语言去描述一个单链表。
‘伍’ 数据结构|单链表表示的三种方法
对于线性表来说, 总得有个头尾,头部做为基准地址,如数组的数组名,链表的头指针。尾部做为结束的标志,数组使用一个长度属性来标识数组的结束位置,字符串使用转义字符'',链表使用NULL指针来标识结束位置。
我们知道,数组的全部元素是集中存储,数组的基准地址是第一个元素的地址,也就是数组名的值,其它元素的索引都是一个整型常量,对元素的访问就是基准地址相对于索引的偏移,所以数组元素可以随机访问。
链式存储是分散存储,通过节点的指针域来建立一个节点与其下一个邻接节点的联系。链式存储的头指针虽然也是整个链式数据结构的基准地址,但要找到某一节点,需要顺序访问,从头节点开始,顺着每一个节点的指针域的值,一个节点一个节点地挼。
我们把链表中第一个节点的存储位置叫做 头指针 , 那么整个链表的存取就必须是从头指针开始进行了。之后的每一个节点, 其实就是上一个的后继指针指向的位置。有时,我们为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为 头节点 。头节点的数据域可以不存储任何信息,谁叫它是第一个呢,有这个特权。也可以存储如线性表的长度等附加信息,头节点的指针域存储指向第一个节点的指针。
是否使用头节点,在实现链表的常用操作时代码的写法稍有区别,使用头节点的方法代码较为简洁。同时,也可以将这个表头节点指针封装到一个结构体中,并在结构体中增加链表长度等信息。
1 使用头节点的链表表示
加头结点的优点:
1)链表第一个位置的操作无需特殊处理;
2)将空表和非空表的处理统一。
2 不使用头节点的链表表示
3 链表和链表节点用不同的结构体来表示
链表用一个结构体来描述,封装一个节点指针做表头,并增加一个链表长度变量,需要时也可以增加一个节点指针做表尾。
-End-
‘陆’ 二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出。
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;
}
}
‘柒’ 线性表顺序存储结构和链式存储结构的定义,以及各自的有缺点,分别适合于哪些应用
定义
顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素。由于表中各个元素具有相同的属性,所以占用的存储空间相同。
线性表按链式存储时,每个数据元素 (结点)的存储包括数据区和指针区两个部分。数据区存放结点本身的数据,指针区存放其后继元素的地址只要知道该线性表的起始地址表中的各个元素就可通过其间的链接关系逐步找到
优缺点
顺序存储需要开辟一个定长的空间,读写速度快,缺点不可扩充容量(如果要扩充需要开辟一个新的足够大的空间把原来的数据重写进去)
链式存储无需担心容量问题,读写速度相对慢些,由于要存储下一个数据的地址所以需要的存储空间比顺序存储大。
‘捌’ 线性表的链式存储结构定义及基本操作
是这个效果吗