• 数据结构/PTA-链表逆置-另类堆栈/函数/链表


    链表逆置

    本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:

    struct ListNode {
        int data;
        struct ListNode *next;
    };

    函数接口定义:

    struct ListNode *reverse( struct ListNode *head );

    其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct ListNode {
        int data;
        struct ListNode *next;
    };
    
    struct ListNode *createlist(); /*裁判实现,细节不表*/
    struct ListNode *reverse( struct ListNode *head );
    void printlist( struct ListNode *head )
    {
         struct ListNode *p = head;
         while (p) {
               printf("%d ", p->data);
               p = p->next;
         }
         printf("
    ");
    }
    
    int main()
    {
        struct ListNode  *head;
    
        head = createlist();
        head = reverse(head);
        printlist(head);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    1 2 3 4 5 6 -1

    输出样例:

    6 5 4 3 2 1

    在只有尾指针的情况下完成倒序。有点烧脑,理清之后很简单

    配合如下图解食用:

     

     这只是前两次逆置的实现,后续同理。

    struct ListNode *reverse( struct ListNode *head )
    {struct ListNode *q;
        struct ListNode *s;
        struct ListNode *s1=NULL;
        q=head;
        for(;q!=NULL;)
        {   s=(struct ListNode *)malloc(sizeof(struct ListNode *));
             s->data=q->data;
             s->next=s1;
             s1=s;
             q=q->next;
        }
        return s1;
    
    };



    另类堆栈

    在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满?

    函数接口定义:

    bool Push( Stack S, ElementType X );
    ElementType Pop( Stack S );

    其中Stack结构定义如下:

    typedef int Position;
    typedef struct SNode *PtrToSNode;
    struct SNode {
        ElementType *Data;  /* 存储元素的数组 */
        Position Top;       /* 栈顶指针       */
        int MaxSize;        /* 堆栈最大容量   */
    };
    typedef PtrToSNode Stack;
    

    注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果队列是空的,则Pop函数必须输出“Stack Empty”,并且返回ERROR。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ERROR -1
    typedef int ElementType;
    typedef enum { push, pop, end } Operation;
    typedef enum { false, true } bool;
    typedef int Position;
    typedef struct SNode *PtrToSNode;
    struct SNode {
        ElementType *Data;  /* 存储元素的数组 */
        Position Top;       /* 栈顶指针       */
        int MaxSize;        /* 堆栈最大容量   */
    };
    typedef PtrToSNode Stack;
    
    Stack CreateStack( int MaxSize )
    {
        Stack S = (Stack)malloc(sizeof(struct SNode));
        S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
        S->Top = 0;
        S->MaxSize = MaxSize;
        return S;
    }
    
    bool Push( Stack S, ElementType X );
    ElementType Pop( Stack S );
    
    Operation GetOp();          /* 裁判实现,细节不表 */
    void PrintStack( Stack S ); /* 裁判实现,细节不表 */
    
    int main()
    {
        ElementType X;
        Stack S;
        int N, done = 0;
    
        scanf("%d", &N);
        S = CreateStack(N);
        while ( !done ) {
            switch( GetOp() ) {
            case push: 
                scanf("%d", &X);
                Push(S, X);
                break;
            case pop:
                X = Pop(S);
                if ( X!=ERROR ) printf("%d is out
    ", X);
                break;
            case end:
                PrintStack(S);
                done = 1;
                break;
            }
        }
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    4
    Pop
    Push 5
    Push 4
    Push 3
    Pop
    Pop
    Push 2
    Push 1
    Push 0
    Push 10
    End

    输出样例:

    Stack Empty
    3 is out
    4 is out
    Stack Full
    0 1 2 5 

     注意Data是个数组!!!

    bool Push( Stack S, ElementType X )
    {
        if(S->Top==S->MaxSize)
        {
            printf("Stack Full
    ");
            return false;
        }
        else 
        {
            S->Data[(S->Top)]=X;
            S->Top++;
            return true;
        }
    }
    ElementType Pop( Stack S )
    {
        if(S->Top==0)
        {
            printf("Stack Empty
    ");
            return ERROR;
        }
        else return S->Data[--(S->Top)];
    }
  • 相关阅读:
    通过前序遍历和中序遍历确定二叉树,并输出后序遍历序列
    浅谈c语言和c++中struct的区别
    KFCM算法的matlab程序
    聚类——KFCM
    FCM算法的matlab程序2
    GMM算法的matlab程序
    FCM算法的matlab程序
    K-means算法的matlab程序
    GMM算法的matlab程序(初步)
    FCM算法的matlab程序(初步)
  • 原文地址:https://www.cnblogs.com/elegantcloud/p/14025065.html
Copyright © 2020-2023  润新知