栈和队列的基本操作(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、队列:

五、总结:

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

相关推荐
jasmine s3 分钟前
Pandas
开发语言·python
郭wes代码4 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
scan72418 分钟前
LILAC采样算法
人工智能·算法·机器学习
biomooc24 分钟前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人26 分钟前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar28 分钟前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound33 分钟前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
菌菌的快乐生活39 分钟前
理解支持向量机
算法·机器学习·支持向量机
大山同学44 分钟前
第三章线性判别函数(二)
线性代数·算法·机器学习
axxy20001 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法