C语言数据结构链栈和循环链表的基础操作

话不多说,上才艺。

一、链栈

(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);
}


(2)结果显示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值