话不多说,上才艺。
一、链栈 (1)完整代码#include(2)结果显示 二、循环链队 (1)完整代码#include #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); }
#include(2)结果显示#include #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); }



