栈和队列的基本操作(C语言版)

链表的基础操作(插入元素、删除元素、查找元素、输出元素)

一、编写链表基本操作的函数:

(1)InitList(LIST *L,int ms): 初始化链表。

(2)InsertListl(LIST *L,int item,int rc):向链表指定位置插入元素。

(3)InsertList2(LIST *L,int item,int rc):向有序链表指定位置插入元素。

(4)DeleteList(LIST *L,int item):删除指定元素值的链表记录。

(5)FindList(LIST *L,int item):查找链表中的元素。

(6)OutputList(LIST *L):输出链表元素。

二、具体步骤:

(1)初始化链表;

(2)调用插人函数建立一个链表;

(3)在链表中寻找指定的元素;

(4)在链表中删除指定值的元素;

(5)遍历并输出链表。

三、代码演示:

1、栈的源代码:

bash 复制代码
#include<stdio.h>
#define MAXN 10         /* 栈的最大容量 */
/* 定义栈的类型为int */

int push( int *stack, int maxn, int *toppt, int x ) /* 进栈函数 */
{
    if( *toppt >= maxn )    /* 栈满,进栈失败,返回1 */
        return 1; 
        stack[*toppt] = x;                  /* 元素进栈 */
        ++(*toppt);                 /* 栈顶指针+1 */
        return 0;               /* 进栈成功 */
}

int pop( int *stack, int *toppt, int *cp )  /*出栈函数*/
{
    if(*toppt == 0)     /* 栈空,出栈失败,返回1 */
       return 1;
       --(*toppt);      /* 栈顶指针−1 */
       *cp = stack[*toppt];
       return 0;        /* 出栈成功 */
}

void OutputStack( int *stack, int toppt )   /* 输出栈元素 */
{
    int i;
    for( i = toppt - 1; i >= 0; i-- )
        printf( "%d", stack[i] );
    printf( "\n" );
}
void main()
{
    int s[MAXN], i;         /* 定义栈 */
    int top = 0;                /* 设置为空栈 */
    int op;
    while( 1 )
    {
        printf( "请选择操作,1:进栈 2:出栈 0:退出 " );
        fflush( stdin );        /* 清空标准输入缓冲区 */
        scanf( "%d", &op );
        switch( op ) {
            case 0:     /* 退出 */
                return;
            case 1:     /* 进栈 */
                printf( "请输入进栈元素:" );
                        scanf( "%d", &i );
                if(push( s, MAXN, &top, i ) == 0) { /* 进栈成功 */
                    printf( "进栈成功,栈内元素为:\n" );
                    OutputStack( s, top );
                }
                else
                    printf( "栈满\n" );
                                break;
            case 2:     /* 出栈 */
                if(pop( s, &top, &i ) == 0) {       /* 出栈成功 */
                    printf( "出栈元素为: [%d] , 栈内元素为:\n" , i );
                    OutputStack( s, top );                    
                }
                else
                    printf( "栈空\n" );
                
                break;
        }
    }
}

2、队列的源代码:

bash 复制代码
#include<stdio.h>
#include<malloc.h>
typedef struct queue {      /* 定义队列结构 */
    int data;       /* 队列元素类型为int */
    struct queue *link;
}QUEUE;

void EnQueue( QUEUE **head, QUEUE **tail, int x )   /* 进队操作 */
{
    QUEUE *p;
    p = (QUEUE *)malloc( sizeof(QUEUE) );
    p->data = x;       
    p->link = NULL;     /* 队尾指向空 */
    if( *head == NULL ) /* 队首为空,即为空队列 */
        *tail = NULL;    
    else {
        (*tail)->link = p;  /* 新单元进队列尾 */
        *tail = p;      /* 队尾指向新入队单元 */
        }
}

int DeQueue( QUEUE **head, QUEUE **tail, int *cp )  /* 出队操作 1:队空 */
{
    QUEUE *p;
        p = *head;
    if( *head == NULL )     /* 队空 */
        return 1;
    *cp = (*head)->data;
    *head = (*head)->link;     
    if( *head == NULL )     /* 队首为空,队尾也为空 */
        *tail = NULL;
    free( p );              /* 释放单元 */
        return 0;
}

void OutputQueue( QUEUE *head )     /* 输出队列中元素 */
{
    while (head != NULL) {
        printf( "%d", head->data );
        head = head->link;
    }
        printf( "\n" );
 }

int main()
{
    QUEUE *head, *tail;
    int op, i;
    head = tail = NULL;     /* 将队列头和尾置为空 */
        while( 1 )
    {    printf( "请选择操作,1:进队 2:出队 0:退出 " );
        fflush( stdin );    /* 清空标准输入缓冲区 */
        scanf( "%d", &op );
        switch( op ) {
            case 0:     /* 退出 */
                return 0;
            case 1:     /* 进队 */
                printf( "请输入进队元素:" );
                    scanf( "%d", &i );
                    EnQueue( &head, &tail, i );
                printf( "队内元素为:\n" );
                OutputQueue( head );
                break;
            case 2:     /* 出队 */
                if( DeQueue( &head, &tail, &i ) == 0 ) {    /* 出队成功 */
                    printf( "出队元素为: [%d] , 队内元素为:\n" , i );
                    OutputQueue( head );
                }
                else
                    printf( "队空\n" );
                break;
        }
    }
}

四、运行结果:

1、栈:

2、队列:

五、总结:

线性表链式存储结构,它不需要用地址连续的存储单元来实现,因为它不要求逻辑上相邻的两个数据元素在物理上也相邻,它是通过"链"建立起数据元素之间的逻辑关系的,因此对线性表的插入、删除不需要移动数据元素。

相关推荐
·云扬·3 分钟前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
Tisfy6 分钟前
LeetCode 3240.最少翻转次数使二进制矩阵回文 II:分类讨论
算法·leetcode·矩阵·题解·回文·分类讨论
橘子遇见BUG35 分钟前
算法日记 31 day 动态规划(01背包)
算法·动态规划
东方巴黎~Sunsiny36 分钟前
java-图算法
java·开发语言·算法
ac-er88881 小时前
PHP二维数组排序算法函数
算法·php·排序算法
Tisfy2 小时前
LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))
算法·leetcode·题解·贪心·思维
小杨 学习日志2 小时前
C高级学习笔记
c语言·笔记·学习
DdddJMs__1352 小时前
C语言 | Leetcode C语言题解之第564题寻找最近的回文数
c语言·leetcode·题解
ad禥思妙想2 小时前
如何运行python脚本
开发语言·python
Matlab程序猿小助手2 小时前
【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·嵌入式硬件·算法·matlab·机器人·无人机