索引
点击跳到链栈
点击跳到链队列
点击跳到单链表
点击跳到双向链表
点击跳到单循环链表
点击跳到双向循环链表
点击跳到线性表两种存储结构的比较
2.1、链栈
采用链式存储结构的栈称为链栈。设栈S=(a1,a2,a3,…,an),其中a1为栈底元素,an为栈顶元素,栈顶指针指向an。如图所示,当栈为空时,栈顶指针为NULL。
由图可见,链栈是由栈顶指针唯一确定的,其类型定义如下:
typedef struct LSNode{
ElemType data;//数据域
struct LSNode *next;//指针域
}LSNode,*LStack;//结点和链栈类型
链栈的接口定义如下:
(一)入栈操作:
该操作为入栈元素e生成一个新结点,并插入在栈顶。
Status Push_LS(LStack &S,ElemType e){
//元素e压入栈S
LSNode *t;
t=(LSNode *)malloc(sizeof(LSNode));//为元素e分配结点空间
if(NULL==t)//分配失败返回
return OVERFLOW;
t->data=e;//在栈顶位置插入新结点
t->next=S;
S=t;
return OK;
}
(二)出栈操作:
若栈S为空,则报错返回;否则,删除栈顶结点,并用参数e返回其元素值。
Status Pop_LS(LStack &s,ElemType &e){
//栈S的栈顶元素出栈,并用e返回
LSNode * t;
if(S==NULL)//判断是否为空栈
return ERROR;
t=S;//t指向栈顶元素结点
e=S->data;//用e返回栈顶元素值
S=S->next;//删除栈顶元素结点
free(t);//释放结点
return OK;
}
2.2、链队列
采用链式存储结构的队列称为链队列,如图所示。由于队列的操作是在队头和队尾两端进行的,故需设置头尾指针指示链表的头尾结点。 链队列的类型定义如下:typedef struct LQNode{
ElemType data;
struct LQNode *next;
}LQNode,*QueuePtr;//结点及其指针类型
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LQueue;//链队列
链队列的接口定义如下:
(一)入队操作:
该操作在链队列Q的队尾插入一个新结点e,并令队尾指针指向该结点。若Q为空,则队头指针也指向该结点。
Status EnQueue_LQ(LQueue &Q,ElemType e){
//在队列Q的队尾插入元素e
LNode *p;
p=(LNode *)malloc(sizeof(LNode));
if(NULL==p)
return OVERFLOW;
p->data=e;
p->next=NULL;
if(Q.front==NULL)//e插入空队列
Q.front=p;
else//e插入非空队列
Q.rear->next=p;
Q.rear=p;//队尾指针指向新结点
return OK