数据结构/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("\n"); } 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\n", 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\n"); return false; } else { S->Data[(S->Top)]=X; S->Top++; return true; } } ElementType Pop( Stack S ) { if(S->Top==0) { printf("Stack Empty\n"); return ERROR; } else return S->Data[--(S->Top)]; }