剑指offer 面试题5 从尾到头打印链表(栈实现)

来源:互联网 发布:netcat端口转发 编辑:程序博客网 时间:2024/05/16 07:48

E:\arithmetic\ReverseLink

O(n)

栈实现

//main.c reverseLink 栈实现 #include <stdio.h>#include "Stack.h"#include "Link.h"void Reverse(Node *head);int main(int argc, char *argv[]){    //测试用例: 多节点 单节点 NULL     int a[] = {1,2,3,4,5,6,7,8,9,0};    int b[] = {1} ;        Node *link1 = NULL;    int i;    for(i=0 ; i<10 ; i++){        addToLink(&link1, a[i]);    }    printLink(link1);    Reverse(link1);        Node *link2 = NULL;    Reverse(link2);    addToLink(&link2, a[0]);    printLink(link2);    Reverse(link2);    return 0;}void Reverse(Node *head){    Stack *s;    s = createStack();    Node *t = head;    if(head == NULL){        printf("reversr failed! NodeLink is NULL!\n");        return;    }    while(t != NULL){        pushStack(s, t->value);                t = t->next;    }    int num;        while(!isEmpty(s)){        num = popStack(s);        printf("%d\t", num);    }    printf("\n");}

//stack.h#ifndef STACK_H_H#define STACK_H_H#include <stdio.h>#include <stdlib.h>//molloc free#include "Link.h"/*typedef struct LinkNode {int value;struct LinkNode *next;}Node, *NodeLink;*/typedef struct NodeStack{Node *top;}Stack;Stack*  createStack();int isEmpty(Stack *s);void pushStack(Stack *s, int n);int popStack(Stack *s);void printStack(Stack *s);#endif 

//stack.c#include "Stack.h"Stack*  createStack(){Stack *s = malloc(sizeof(Stack));s->top = NULL;return s;}int isEmpty(Stack *s){return s->top==NULL ? 1:0;}void pushStack(Stack *s, int n){Node *t = malloc(sizeof(Node));t->value = n;t->next = s->top;s->top = t;}int popStack(Stack *s){if(isEmpty(s)){printf("Stack is empty! quit!\n");return -1;//??}int n = s->top->value;Node *t = s->top;s->top= t->next;free(t);return n; }void printStack(Stack *s){Node *t = s->top;while(t != NULL){printf("%d\t", t->value);t = t->next;}}

#ifndef LINK_H_H#define LINK_H_H#include <stdio.h>#include <stdlib.h>//molloc freetypedef struct LinkNode {int value;struct LinkNode *next;}Node;void printLink(struct LinkNode *head);void addToLink(struct LinkNode **head, int value);void deleteLink(struct LinkNode **head, int value);#endif 


0 0
原创粉丝点击