栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

话不多说,上才艺。

一、链栈 (1)完整代码
#include
#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);
}


(2)结果显示

二、循环链队 (1)完整代码
#include
#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);
}


(2)结果显示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号