话不多说,上才艺。
一、链栈
(1)完整代码
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int status;
typedef struct StackNode //链栈的链式存储结构
{
SElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
status Init(LinkStack& S) //构造一个空栈
{
S = NULL;
return OK;
}
status Push(LinkStack& S, SElemType e) //在栈顶插入元素e
{
StackNode* p;
p = new StackNode; //生成新结点
p->data = e; //将新结点数据域置为e
p->next = S; //将新结点插入栈顶
S = p; //修改栈顶指针为p
return OK;
}
status Output(LinkStack& S) //输出链栈中的元素
{
StackNode* p;
p = S; //p指向栈顶
while (p)
{
printf("%4d", p->data); //输出链栈元素
p = p->next;
}
return OK;
}
SElemType GetTop(LinkStack& S) //取栈顶元素
{
if (S != NULL) //栈非空
return S->data; //返回栈顶元素
}
status Pop(LinkStack& S, SElemType& e) //删除S的栈顶元素,用e返回其值
{
if (S == NULL) //判断链栈是否为空
return ERROR;
StackNode* p;
e = S->data; //将栈顶元素赋给e
p = S; //用p临时保存栈顶元素空间,以备释放
S = S->next; //修改栈顶指针
delete p; //释放原栈顶元素空间
return OK;
}
void main()
{
int i, k;
int e;
LinkStack S;
Init(S);
for (i = 0; i < 9; i++)
Push(S, i);
printf("链栈输出为:");
Output(S);
k=GetTop(S);
printf("\n栈顶元素为%d", k);
Pop(S, e);
printf("\n删除栈顶元素后的链栈:");
Output(S);
}
(2)结果显示
二、循环链队
(1)完整代码
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int QElemType;
typedef int status;
typedef struct Qnode //队列的链式存储结构
{
QElemType data;
struct Qnode* next;
}QNode;
typedef struct //定义队头指针和队尾指针
{
QNode *front;
QNode *rear;
}LinkQueue;
status Init(LinkQueue* Q) //链队初始化
{
Q->front = Q->rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点
Q->front->next = NULL; //头结点的指针域置空
return OK;
}
status EnQueue(LinkQueue* Q, QElemType e) //链队的入队
{
QNode *p;
p = new QNode; //为入队元素分配结点空间,用指针p指向
p->data = e; //将新结点数据域置为e
p->next = NULL;
Q->rear->next = p; //将新结点插入到队尾
Q->rear = p; //修改队尾指针
return OK;
}
status Output(LinkQueue* Q) //输出链队中的元素
{
if (Q->front == Q->rear) //判断链队是否为空
printf("队列为空!");
QNode* p;
p = Q->front->next; //p指向队头元素
while (!(Q->rear == p))
{
printf("%4d", p->data); //输出链队元素
p = p->next;
}
printf("%4d", Q->rear->data); //记得输出rear指向的结点元素
return OK;
}
QElemType GetHead(LinkQueue* Q) //取链队的队头元素
{
if (Q->front != Q->rear)
return Q->front->next->data; //返回队头元素的值,队头指针不变
}
status DeQueue(LinkQueue* Q, QElemType& e) //删除链队的队头元素
{
if (Q->front == Q->rear) //判断列队是否为空
return ERROR;
QNode* p;
p = Q->front->next; //p指向队头元素
e = p->data; //e保存队头元素的值 这两句相当于临时保存队头元素的空间,以备释放
Q->front->next = p->next; //修改头结点的指针域
if (Q->rear == p) //最后一个元素被删,队尾指针指向头结点
Q->rear = Q->front;
delete p; //释放原队头元素的空间
return OK;
}
void main()
{
int i, k;
int e;
LinkQueue Q;
Init(&Q);
for (i = 0; i < 9; i++)
EnQueue(&Q, i);
printf("the list is:");
Output(&Q);
k=GetHead(&Q);
printf("\n队头元素为%d", k);
DeQueue(&Q, e);
printf("\n删除队头元素后的队列:");
Output(&Q);
}