PTA合集

堆栈操作合法性
#include<stdio.h>

int main()
{
    //输入栈容量和操作数,用length表示栈内现有元素个数
    int Ssize, oper, counter, length = 0,flag = 0;
    scanf("%d %d ",&oper, &Ssize);
    for(counter = 0; counter < oper; counter ++) {
        char chr;
        //s入栈,length加一,x出栈,length减一
        while((chr = getchar()) != '\n') {
            if(chr == 'S') {
                length++;
                if(length > Ssize)
                    flag = 1;
            }
            if(chr == 'X') {
                length--;
                if(length < 0)
                    flag = 1;
            }
        }
        if(length == 0 && flag == 0)
            printf("YES\n");
        else
            printf("NO\n");
        length = 0;
        flag = 0;
    }
    return 0;
}
求链式线性表的倒数第K项
#include<stdio.h>
#include<malloc.h>
struct Node{
    int data;
    struct Node *next;
};
int main()
{
    int k,t,i;
    scanf("%d",&k);
    struct Node *head,*p;
    head=(struct Node *)malloc(sizeof(struct Node));
    head->next=NULL;
    while(scanf("%d",&t)&&t>=0)
    {
        p=(struct Node *)malloc(sizeof(struct Node));
        p->data=t;
        p->next=head->next;
        head->next=p; 
    }
    for(i=0;i<k;i++)
    head=head->next;
    if(head) printf("%d",head->data);
    else printf("NULL");
}
————————————————
两个有序链表序列的交集
//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

//打印链表中的数据
void ListPrint_L(LinkList &L)
{
    if (L->next == NULL)
    {
        printf("NULL");
        return;
    }
    //输出单链表
    LNode *p = L->next; // p指向第一个元素结点
    while (p != NULL)
    {
        if (p->next != NULL)
            printf("%d ", p->data);
        else
            printf("%d", p->data);
        p = p->next;
    }
}
//为链表添加结点,需要传入直接前驱
LNode *addLNode(LinkList &L, ElemType e)
{
    L->next = (LinkList)malloc(sizeof(LNode));
    if (!(L->next))
    {
        exit(OVERFLOW);
    }
    L->next->data = e;
    L->next->next = NULL;
    return L->next;
}

Status ListCreate_L(LinkList &L)
{
    L = (LNode *)malloc(sizeof(LNode));
    L->next = NULL;
    if (!L)
    {
        exit(OVERFLOW);
    }
    LNode *p = L;
    int num = 0;
    while (scanf("%d", &num) != EOF)
    {
        if (num == -1)
        {
            break;
        }
        p = addLNode(p, num);
    }
    return OK;
}

LNode *LinkOrderList(LinkList &L1, LinkList &L2)
{
    LNode *head = (LNode *)malloc(sizeof(LNode));
    head->next = NULL;
    //列表有一个为空的情况
    if ((L1->next) && (L2->next))
    {
        LNode *s = L1, *t = L2, *p = head;
        while ((s->next) && (t->next))
        {
            if ((s->next->data) > (t->next->data))
            {
                t = t->next;
            }
            else if ((s->next->data) < (t->next->data))
            {
                s = s->next;
            }
            else
            {
                p = addLNode(p, s->next->data);
                s = s->next;
                t = t->next;
            }
        }
    }
    return head;
}

int main()
{
    LNode *L1 = (LNode *)malloc(sizeof(LNode)), *L2 = (LNode *)malloc(sizeof(LNode));
    ListCreate_L(L1);
    ListCreate_L(L2);
    LNode *head = LinkOrderList(L1, L2);
    ListPrint_L(head);
    return 0;
}
两个有序链表序列的合并
//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

Status ListCreate_L(LinkList &L)
{
    L = (LNode *)malloc(sizeof(LNode));
    if (!L)
    {
        exit(OVERFLOW);
    }
    L = (LNode *)malloc(sizeof(LNode));
    LNode *tmp = L;
    int n = 0, num = 0;
    while (scanf("%d", &num) != EOF)
    {
        if (num == -1)
        {
            break;
        }
        tmp->next = (LNode *)malloc(sizeof(LNode));
        tmp->next->data = num;
        tmp = tmp->next;
        n++;
    }
    tmp->next = NULL;
    L->data = n;
    return OK;
}

void ListPrint_L(LinkList &L)
{
    if (L->next==NULL) {
        printf("NULL");
        return ;
    }
    //输出单链表
    LNode *p = L->next; // p指向第一个元素结点
    while (p != NULL)
    {
        if (p->next != NULL)
            printf("%d ", p->data);
        else
            printf("%d", p->data);
        p = p->next;
    }
}

LNode *LinkOrderList(LinkList &L1, LinkList &L2)
{
    //确定头部最小的序列
    if (!(L1->next)) {
        return L2;
    }
    if (!(L2->next)) {
        return L1;
    }
    LinkList p = L1->next, t = L2->next;
    if ((L1->next->data) > (L2->next->data))
    {
        p = L2->next, t = L1->next;
    }
    while (p->next != NULL && t != NULL)
    {
        if ((p->next->data) > (t->data))
        {
            LinkList s = p->next;
            p->next = t;
            t = s;
        }
        else
        {
            p = p->next;
        }
    }
    p->next = t;
    return L1;
}

int main()
{
    LinkList L1, L2;

    if (ListCreate_L(L1) != OK)
    {
        printf("表创建失败!!!\n");
        return -1;
    }
    if (ListCreate_L(L2) != OK)
    {
        printf("表创建失败!!!\n");
        return -1;
    }
    LNode *head = LinkOrderList(L1, L2);
    ListPrint_L(head);
    return 0;
}
————————————————
带头结点的单链表就地逆置
void ListReverse_L(LinkList &L)//L为头结点
{
    LinkList p,q;
    p = L->next;
    L->next = NULL;
    while(p)
    {
        //向后挪
        q = p;//
        p = p->next;
        //头插
        q->next = L->next;//非常重要,相当于p和q之间没有了指针连接
        L->next = q;//把q接到头的后面
    }
}
7-2 jmu-ds-顺序表区间元素删除
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;

//顺序表的存储结构定义
#define LIST_INIT_SIZE 11
#define LISTINCREMENT 10
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct
{
    ElemType *elem; //存储空间基地址
    int length;     //表中元素的个数
    int listsize;   //表容量大小
} SqList;           //顺序表类型定义

Status InitList_Sq(SqList &L)
{
    //初始化L为一个空的有序顺序表
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)
        exit(OVERFLOW);
    L.listsize = LIST_INIT_SIZE;
    L.length = 0;
    return OK;
}

Status ListInsert_Sq(SqList &L, int pos, ElemType e)
{
    if (L.length == L.listsize)
    {
        ElemType *tmp = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!tmp)
            exit(OVERFLOW);
        L.elem = tmp;
    }
    if (pos > L.length + 1 || pos < 1)
    {
        return ERROR;
    }
    for (int i = L.length; i > pos - 1; i--)
    {
        L.elem[i] = L.elem[i - 1];
    }
    L.elem[pos - 1] = e;
    L.length++;
    return OK;
}

Status ListDelete_Sq(SqList &L, int pos)
{
    for (int i = pos - 1; i < L.length; i++)
    {
        L.elem[i] = L.elem[i + 1];
    }
    L.length--;
    return OK;
}

void ListPrint_Sq(SqList L)
{
    for (int i = 0; i < L.length - 1; i++)
    {
        printf("%d ", L.elem[i]);
    }
    printf("%d\n", L.elem[L.length - 1]);
}

int main()
{
    SqList L;
    if (InitList_Sq(L) != OK)
    {
        printf("InitList_Sq: 初始化失败!!!\n");
        return -1;
    }
    int n = 0;
    int tmp = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &tmp);
        ListInsert_Sq(L, i, tmp);
    }
    ElemType min = 0, max = 0;
    scanf("%d", &min);
    scanf("%d", &max);
    // if (min > max)
    // {
    //     tmp = min;
    //     min = max;
    //     max = tmp;
    // }

    for (int i = 0; i < L.length;)
    {
        if (min <= L.elem[i] && L.elem[i] <= max)
        {
            ListDelete_Sq(L, i + 1);
        }
        else
        {
            i++;
        }
    }
    ListPrint_Sq(L);
    return 0;
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593118

有序顺序表的插入
Status ListInsert_SortedSq(SqList &L, ElemType e)
{
    if (L.length == L.listsize)
    {
        L.elem = (ElemType *)realloc(L.elem, (1 + L.length) * sizeof(ElemType));
    }
    int j = L.length;
    for (; j > 0; j--)
    {
        if (e > L.elem[j - 1])
        {
            break;
        }
        else
        {
            L.elem[j] = L.elem[j - 1];
        }
    }
    L.elem[j] = e; 
    L.length = L.length + 1;

    return OK;
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593105
顺序表创建和就地逆置
Status ListCreate_Sq(SqList &L) {
        //初始化L为一个空的有序顺序表
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)
        exit(OVERFLOW);
    L.listsize = LIST_INIT_SIZE; //顺序表的容量
    L.length = 0;                //顺序表的元素个数
    int n = 0;
    
    scanf("%d",&n);
    for (int i=0;i<n;i++) {
        scanf("%d",&(L.elem[i]));
        L.length ++;
    }
    return OK;
}

void ListReverse_Sq(SqList &L) {
    for (int i=0;i<L.length/2;i++) {
        ElemType tmp = L.elem[i];
        L.elem[i] = L.elem[L.length-1-i];
        L.elem[L.length-1-i] = tmp;
    }
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593099
循环单链表区间删除
Status ListCreate_CL(LinkList &CL)
{
    CL = (LinkList)malloc(sizeof(LNode));
    LinkList rear = CL;
    rear->next = NULL;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        LNode *t = (LNode*)malloc(sizeof(LNode));
        scanf("%d",&t->data);
        t->next = rear->next;
        rear->next=t;
    }
    rear->next = CL;
    return OK;
}

void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
    LNode *p = CL;
    LNode *q;
    while(p->next !=CL)
    {
        q=p->next;
        if(p->data>min&&p->data<max)
        {
            p-next = q-next;
            free(q);
        }
        else
            p=p->next;
    }
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593030
顺序表基本操作
Status ListInsert_Sq(SqList &L, int pos, ElemType e)
{
    if (L.length == L.listsize)
    {
        ElemType *tmp = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!tmp)
            exit(OVERFLOW);
        L.elem = tmp;
    }
    if (pos > L.length + 1 || pos < 1)
    {
        return ERROR;
    }
    for (int i = L.length; i > pos - 1; i--)
    {
        L.elem[i] = L.elem[i - 1];
    }
    L.elem[pos - 1] = e;
    L.length++;
    return OK;
}

void ListPrint_Sq(SqList L)
{
    for (int i = 0; i < L.length - 1; i++)
    {
        printf("%d ", L.elem[i]);
    }
    printf("%d\n", L.elem[L.length - 1]);
}

Status ListDelete_Sq(SqList &L, int pos, ElemType &e)
{
    e = L.elem[pos - 1];
    for (int i = pos - 1; i < L.length; i++)
    {
        L.elem[i] = L.elem[i + 1];
    }
    L.length--;
    return OK;
}

int ListLocate_Sq(SqList L, ElemType e)
{
    for (int i = 0; i < L.length; i++)
    {
        if (L.elem[i] == e)
        {
            return i + 1;
        }
    }
    return 0;
}
 
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127592982

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值